使用 Tkinter 的代码在 IDLE 中工作,但在终端中不起作用



这是我的第一个程序的一部分。它使用 Tkinter 在滚动文本框中输出文本。我使用了 Python 3.6.4 和 IDLE,它运行良好,但是当我从下拉菜单中选择选项后单击 ok 从终端/Atom 运行它时,它只是关闭而没有错误,而在 IDLE 中它正确输出文本框中的所有文本。

我想使用 Py2app 制作独立游戏,但为此代码需要从终端正确执行。

以下是代码中的主要片段。我只是编码了几个月,所以任何详细的帮助将不胜感激。

from tkinter import *
from collections import OrderedDict
from tkinter.scrolledtext import *
from collections import Counter
master = Tk()
master.title("App")
master.geometry("600x665")
master.lift()
master.attributes('-topmost', True)
mvar = IntVar()
mvar1 = IntVar()
var = StringVar(master)
var.set("Asc")
var1 = StringVar(master)
var1.set("Ar")
x = OptionMenu(master, var, "Ar", "Ta", "Ge","Can","Le","Vi","Li","Sc","Sa","Cap","Aq","Pi")
x.grid(column =2,row =1)
x1 = OptionMenu(master, var1, "Ar", "Ta", "Ge","Can","Le","Vi","Li","Sc","Sa","Cap","Aq","Pi")
x1.grid(column =2,row =2)

def redirector(inputStr):
txt.insert(INSERT, inputStr)
sys.stdout.write = redirector     
def ok():
redirector("Thanks for using the app")
master.quit() 

label1 = Label(text="  Welcome to the app",bg="#C2DFFF",font=("Times New Roman",18))
label1.grid(column=0,row=0)
label2 = Label(text="Ma: ",bg="#C2DFFF")
label2.grid(column=0,row=2)
txt = ScrolledText(master, bg="#C2DFFF", width = 97, height= 25, font = "Arial 11")
txt.grid(column = 0, row = 14, columnspan=3)
button = Button(master, text="OK", default ='active',command=ok).grid(column=2,row=11)
button = Button(master, text="Reset", default ='active',command=reset).grid(column=2,row=12)
button = Button(master, text ="Cancel",command = cancel).grid(column=0,row=11)
C1 = Checkbutton(master, state = ACTIVE, variable = mvar)
C1.grid(column = 1, row=2)
C2 = Checkbutton(master, state = ACTIVE, variable = mvar1)
C2.grid(column = 1, row=3)

master.mainloop()

这就是 GUI 的外观

您通常不能重新分配sys.stdout.write - 它通常是内置文件对象的只读属性。 执行输出重定向的正确方法是将一个新对象分配给sys.stdout,该对象具有write()方法。

您的代码之所以在 IDLE 中工作,只是因为 IDLE 已将内置sys.stdout替换为其自己的重定向对象,该对象是完全可修改的。

最新更新