Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x tkinter根窗口和单选按钮GUI生成问题_Python 3.x_User Interface_Tkinter_Radio Button - Fatal编程技术网

Python 3.x tkinter根窗口和单选按钮GUI生成问题

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()等),此空白窗口

作为tkinter for Python 3的新手,尽管阅读了文档和堆栈溢出问题的答案,但在导航如何生成GUI(在Python脚本的上下文中)时,我还是遇到了一些小问题。我的目标是创建一个具有7个单选按钮选项的帧,每个选项对应于屏幕分辨率大小,当选中并按下submit按钮时,选中的单选按钮将其值传递给变量。然而,当我实现GUI时,我会遇到两个问题

第一个是我的框架正确打开单选按钮,但另一个框架,这是空白的,标题是“tk”出现。无论我做什么(如其他人提到的使用
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语句只调用一次类,那么这样做的好处是什么?我只是想知道,以备将来参考。再次感谢!正确的方法是不要破坏它。重复使用它。因此,不要创建新的“根”,使用旧的根。如果您想重用类定义(有一天您可能会这样做),那么保持类定义的全局性是很重要的,它还可以保持代码整洁。此外,如果需要,还可以将类定义移动到另一个文件中。