gpt4 book ai didi

python - 为什么写入后文件为空?

转载 作者:行者123 更新时间:2023-12-01 06:39:00 25 4
gpt4 key购买 nike

我有一个 tkinter 应用程序和一个将一些数据写入文件的线程。如果我让线程完成它的工作,文件就是空的。如果我在线程完成之前终止程序(单击 pyCharm 中的红色方 block ),则文件将填充数据直到终止点。这是重现该问题的代码:

import tkinter as tk
import _thread
import numpy as np

img_list = []


def create_img_list():
for i in range(1000):
img = np.random.rand(385, 480)
img = img * 65535
img = np.uint16(img)
img_list.append(img)


def write_to_file():
f = open("test.Raw", "wb")
for img in img_list:
f.write(img)
f.close()


root = tk.Tk()
button = tk.Button(root, text="Click Me", command=_thread.start_new_thread(write_to_file, ())).pack()
create_img_list()
root.mainloop()

这是怎么回事以及如何修复它?

最佳答案

当我将 print(img_list) 添加到 write_to_file() 时,我看到该函数在开始时执行 - 无需单击按钮 - 甚至在 create_img_list() 之前执行 运行(创建列表),因此 write_to_file() 写入空列表。

您错误地使用了command=。它需要不带 () 的函数名称(所谓的“回调”),但您运行函数并将其结果分配给 command=。你的代码的工作方式类似于

result = _thread.start_new_thread(write_to_file, ()) # it executes function at start

button = tk.Button(root, text="Click Me", command=result).pack()

但你需要

def run_thread_later():
_thread.start_new_thread(write_to_file, ())

button = tk.Button(root, text="Click Me", command=run_thread_later).pack()

最终您可以使用lambda直接在command=中创建此函数

button = tk.Button(root, text="Click Me", command=lambda:_thread.start_new_thread(write_to_file, ())).pack()
<小时/>

顺便说一句:你有一个常见的错误

button = Button(...).pack()

None 分配给变量,因为 pack()/grid()/place() 返回 `无。

如果稍后需要访问按钮,则必须分两行完成

button = Button(...)
button.pack()

如果您稍后不需要访问 button 那么您可以跳过 `button()

Button(...).pack()

关于python - 为什么写入后文件为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59544054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com