我正在编写一个打算用 cx_Freeze 冻结的脚本。我正在使用 Python 3.6 和 cx_Freeze 5.1.1。
我目前面临的问题是,我的 Python 脚本——完美地作为 .py
工作——一旦被 cx_Freeze 冻结,确实读取了 text.txt
文件的内容,但似乎无法在上面写入。
我已经编写了我正在尝试做的简化版本,但问题仍然存在。
这是我的main.py
:
from tkinter import *
def writing():
word = str(word_field.get())
ft = open('text.txt', 'w')
ft.write(word)
ft.close()
def from_file():
ft = open('text.txt', 'r')
string = ''
for line in ft:
line = line.strip()
string = string+line
ft.close()
root2 = Tk()
result = Label(root2, text=string)
result.grid(row=1, column=1)
root2.mainloop()
root = Tk()
root.title('My window')
word_field = Entry(root)
btn_1 = Button(root, text='Read', command=from_file)
btn_2 = Button(root, text='Write', command=writing)
word_field.grid(row=1, column=1, columnspan=2)
btn_1.grid(row=2, column=1)
btn_2.grid(row=2, column=2)
root.mainloop()
这是我用于 cx_Freeze 的 setup.py
from cx_Freeze import setup, Executable
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
setup(
name = "Prova",
version = "1.0.0",
options = {"build_exe": {
'packages': ["tkinter"],
'include_files' : [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), \
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), 'text.txt'],
'include_msvcr': True,
}},
executables = [Executable("main.py", base="Win32GUI")]
)
知道它为什么会这样吗?
提前谢谢你!
【问题讨论】:
我刚刚尝试了您的脚本,它可以正常工作。我编译并且它也工作了。你怎么了?
嗨西蒙,我面临的问题是,使用冻结的脚本,我可以读取文件的内容,但不能在上面写字。如果您说它对您有用,我想问题可能出在其他地方。由于我现在很好奇,我试图将它安装在另一台机器上,但它也不起作用。所以问题可能不在于脚本的编写方式,而在于冻结过程。有什么建议吗?
Ping 下次你想和某人交谈时(@Simon)我会早点回复,因为我知道你已经回复了(我只收到这条消息,因为我刚好在看这里)。是的,当我按下读取时,它读取一行,当我写入时,它写入我输入的行。我需要更多信息。操作系统版本是什么,错误回溯(这是您提到的另一台机器)。您确定从 CLI 运行时没有错误吗?
这可能值得一试,但老实说,我以前从未听说过这样的事情。
嗨@Simon,第一个信息(我使用的是 Python 3.6、Cx_Freeze 5.1.1、Win7 64 位)。当我在冻结之前测试脚本时,我一直在终端上查看并且没有错误或回溯,它可以正常工作。在我冻结它之后,单击按钮 1 它会读取文件的内容,但是如果我在输入字段中写入并单击按钮 2,它似乎没有任何效果,文件根本没有改变。我什至尝试安装以将其冻结在另一台电脑上,但它也不起作用。我的想法不多了...
本文链接:http://task.lmcjl.com/news/15146.html