Python 3.x tkinter根窗口和单选按钮GUI生成问题
作为tkinter for Python 3的新手,尽管阅读了文档和堆栈溢出问题的答案,但在导航如何生成GUI(在Python脚本的上下文中)时,我还是遇到了一些小问题。我的目标是创建一个具有7个单选按钮选项的帧,每个选项对应于屏幕分辨率大小,当选中并按下submit按钮时,选中的单选按钮将其值传递给变量。然而,当我实现GUI时,我会遇到两个问题 第一个是我的框架正确打开单选按钮,但另一个框架,这是空白的,标题是“tk”出现。无论我做什么(如其他人提到的使用Python 3.x tkinter根窗口和单选按钮GUI生成问题,python-3.x,user-interface,tkinter,radio-button,Python 3.x,User Interface,Tkinter,Radio Button,作为tkinter for Python 3的新手,尽管阅读了文档和堆栈溢出问题的答案,但在导航如何生成GUI(在Python脚本的上下文中)时,我还是遇到了一些小问题。我的目标是创建一个具有7个单选按钮选项的帧,每个选项对应于屏幕分辨率大小,当选中并按下submit按钮时,选中的单选按钮将其值传递给变量。然而,当我实现GUI时,我会遇到两个问题 第一个是我的框架正确打开单选按钮,但另一个框架,这是空白的,标题是“tk”出现。无论我做什么(如其他人提到的使用root.draw()等),此空白窗口
root.draw()
等),此空白窗口仍会出现
我遇到的第二个也是更令人困惑的问题是,当生成时,除了第一个单选按钮外,其他所有按钮都被选中,通常不会在中间有点,而是带有连字符。现在,用户可以按他/她想要的选项,除了选择之外,所有选项都将取消选择,但这看起来不正常,可能会让用户感到困惑。我读过关于将tristatevariable设置为none的文章,但这并没有起作用(至少在我的试验中是这样)。我还试图在所有单选按钮生成之前在其上强制执行一个deselect()
函数,但这也不起作用。另外,请记住,单选按钮的变量必须处理字符串而不是int。这里发生了什么,如何修复它
与这两个看似相关的问题相关的代码片段如下:
if urldata == None:
class ResolutionInputGUI:
def __init__(self, master):
self.master = master
master.title("My GUI")
self.label = tk.Label(master, text="Your Screen Resolution Is: " + screenres + "\n")
self.label.pack()
MODES = [
("500×500", "500×500"),
("1280×800", "1280×800"),
("1280×1024", "1280×1024"),
("1440×900", "1440×900"),
("1680×1050", "1680×1050"),
("1920×1080", "1920×1080"),
("1920×1200", "1920×1200")
]
resolution = tk.StringVar()
resolution.set("500×500")
for text, mode in MODES:
self.radiobutton = tk.Radiobutton(master, text=text, variable=resolution, value=mode)
self.radiobutton.pack(anchor=tk.W)
self.submit_button = tk.Button(master, text="Submit", command=self.submit)
self.submit_button.pack()
self.cancel_button = tk.Button(master, text="Cancel", command=self.cancelbutton)
self.cancel_button.pack()
def submit(self):
global screenres
screenres = self.radiobutton.get()
root.quit()
self.master.destroy()
print(screenres)
def cancelbutton(self):
raise SystemExit
root = tk.Tk()
my_gui = ResolutionInputGUI(root)
root.mainloop()
任何帮助都将不胜感激,因为我似乎无法解决这个问题,而且tkinter似乎比最初想象的要复杂得多。还有,我在这里做了什么效率低下的事情,或者是为了让最终用户体验更“友好”吗?非常感谢
第一个是我的框架正确打开单选按钮,但另一个框架,这是空白的,标题是“tk”出现
这是因为您调用了两次Tk()。我在末尾看到了其中一个,在代码的其他地方必须有另一个
除第一个单选按钮外,其他所有按钮均被选中,通常不在中间有点,而是带有连字符
这是因为您使用的是局部变量。将“决议”改为“自我决议”
选择并按下提交按钮后,所选单选按钮将其值传递给变量
为此,需要从变量而不是按钮返回值
此外,您应该将类定义放在全局级别
import tkinter as tk
class ResolutionInputGUI:
def __init__(self, master):
self.master = master
master.title("My GUI")
self.label = tk.Label(master, text="Your Screen Resolution Is: " + screenres + "\n")
self.label.pack()
MODES = [
("500×500", "500×500"),
("1280×800", "1280×800"),
("1280×1024", "1280×1024"),
("1440×900", "1440×900"),
("1680×1050", "1680×1050"),
("1920×1080", "1920×1080"),
("1920×1200", "1920×1200")
]
self.resolution = tk.StringVar(master, value="500×500")
for text, mode in MODES:
self.radiobutton = tk.Radiobutton(master, text=text, variable=self.resolution, value=mode)
self.radiobutton.pack(anchor=tk.W)
self.submit_button = tk.Button(master, text="Submit", command=self.submit)
self.submit_button.pack()
self.cancel_button = tk.Button(master, text="Cancel", command=self.cancelbutton)
self.cancel_button.pack()
def submit(self):
global screenres
screenres = self.resolution.get()
root.quit()
self.master.destroy()
print(screenres)
def cancelbutton(self):
raise SystemExit
if urldata == None:
root = tk.Tk()
my_gui = ResolutionInputGUI(root)
root.mainloop()
你的电脑出毛病了indentation@BryanOakley是的,由于某种原因,我无法让它在“if”语句之后正确缩进,以输入堆栈溢出。它运行,它只是有上面解释的问题。我们只能按照我们看到的去做。请花点时间来修好它。这就成功了;非常感谢你!我确实生成了另一个tk窗口,我想因为它从未关闭过,所以它会重新出现。我可以使用root.draw()摆脱窗口,但其他任何东西(如.destroy)都没有任何作用。这是处理关闭tk窗口的正确方法吗?tk窗口被用来测量屏幕分辨率?另外,谢谢你给我的关于保持课堂全球化的建议。从面向对象的角度来看,如果使用if语句只调用一次类,那么这样做的好处是什么?我只是想知道,以备将来参考。再次感谢!正确的方法是不要破坏它。重复使用它。因此,不要创建新的“根”,使用旧的根。如果您想重用类定义(有一天您可能会这样做),那么保持类定义的全局性是很重要的,它还可以保持代码整洁。此外,如果需要,还可以将类定义移动到另一个文件中。