2017-07-03 85 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