2017-07-03 62 views
0

至于有人新的Tkinter的Python 3,我有一对夫妇的导航如何生成GUI(在Python脚本的上下文中)的小问题,尽管阅读文档和堆栈溢出答案。我的目标是创建一个帧7所单选按钮选择的每一个对应于选择时的屏幕分辨率大小和提交按钮被按下时,选择的无线按钮,将其值传递到一个变量。但是,当我实现我的GUI时,我遇到了两个问题。问题与Tkinter的根窗口和单选按钮GUI生成

首先是我的框架上,单选按钮正常打开,但出现另一个框架,这是空白,标题为“TK”。无论我做什么(即使用root.withdraw()等,如其他人所提到的),这个空白窗口仍然出现。

我遇到的第二和更令人费解的问题是,当产生的,但所有的第一个单选按钮被选择时,通常不与在中心的点,但以连字符。现在,用户可以按他/她想要的选项,除了选择之外,它将全部取消选择,但它看起来不正常,并且可能会混淆用户。我读了关于设置tristate变量为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的似乎要比更复杂原本以为。此外,还有什么我在这里效率低下或让最终用户的体验更“友好”?非常感谢!

+0

有你的缩进 –

+0

不对劲@BryanOakley是,由于某种原因,我无法得到它的“如果”语句后缩进正确输入它的堆栈溢出。它运行,只是有上面解释的问题。 –

+0

我们只能通过我们所看到的。请花时间修复它。 –

回答

1

首先是我的框架上,单选按钮正常打开,但另一个框架,这是空白,标题为“TK”出现

这是因为你在呼唤Tk()两次。我看到其中的一个接近尾声,并且您的代码中必须有其他位置。

除了第一个单选按钮被选中,通常不是在中间有一个圆点,而是用连字符。

这是因为您使用的是局部变量。将“分辨率”更改为“self.resolution”。

选择何时提交按钮被按下时,所选择的单选按钮,将其值传递给一个变量

要做到这一点,你需要从变量从返回的值,而不是按钮。

此外,你应该把类的定义在全球层面。

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() 
+0

这个伎俩;非常感谢!我确实有另一个tk窗口生成,我猜是因为它从来没有关闭,它重新出现。我能够使用root.withdraw()除掉窗口,但其他任何东西(如.destroy)都没有做任何事情。这是正确的方式来处理关闭tk窗口被捣毁用于测量屏幕分辨率?此外,感谢您提供有关保持课程全球化的建议。从面向对象的角度来看,如果只用if语句调用一次类,这会带来什么好处?只是想知道以供将来参考。再次感谢! –

+1

正确的方法是不要销毁它。重新使用它。所以不要创造一个新的“根”,使用旧的。如果你想重用它(你可能希望有一天会这么做),那么保持全局类定义是非常重要的,它还可以保持代码整洁。此外,它允许您将类定义移动到另一个文件,如果你想。 – Novel