2017-07-03 2 views
0

Python 3用のtkinterに新しい人物として、ドキュメンテーションとスタックを読んでいるにも関わらず(Pythonスクリプトのコンテキストで)GUIを生成する方法を調べるには、オーバーフローの答え。私の目的は、ラジオボタンの選択肢が7つあり、それぞれが選択されたときに送信ボタンが押されると、選択されたラジオボタンはその値を変数に渡します。しかし、私は私のGUIを実装すると、私は2つの問題が発生します。tkinterのルートウィンドウとラジオボタンのGUI生成の問題

最初は、自分のフレームがラジオボタンで正しく開きますが、空白で「tk」というタイトルの別のフレームが表示されます。私が何をしていても(つまり、他の人が触れたようにroot.withdraw()などを使用してください)、この空白のウィンドウは引き続き表示されます。

私が抱えている2番目の問題は、生成されたときに最初のラジオボタン以外のすべてが選択され、通常は中央のドットではなくハイフンで選択されることです。ユーザーは選択したオプションを押すことができます。選択以外はすべて選択解除されますが、通常のようには見えず、おそらくユーザーを混乱させるでしょう。私はtristatevariableを誰にも設定していないが、それはうまくいきませんでした(少なくとも私の裁判では)。私はまた、生成する前にすべてのラジオボタンにdeselect()の機能を強制しようとしましたが、どちらも機能しませんでした。また、ラジオボタンの変数はintではなく文字列を処理する必要があることに注意してください。ここで何が起こっていて、どうすれば修正できますか?私はこの問題とTkinterにははるかに複雑よりであるように思わ解決するように見えるカントとして任意の助けいただければ幸いです

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

次のように

これらの一見関連の問題の両方に関連するコードスニペットがありますもともと思った。また、ここで非効率的にやっていることや、エンドユーザーエクスペリエンスをより「フレンドリー」にするための何かがありますか?どうもありがとうございます!

+0

@BryanOakleyはい、何らかの理由で、私はそれがスタックオーバーフローのためにそれを入力するための「if」文の後に、適切にインデントすることができなかったあなたのインデント –

+0

と間違って何かがあります。それは走ります、それはちょうど上で説明された問題を持っています。 –

+0

私たちは私たちが見るものによってのみ行くことができます。それを修正する時間をかけてください。 –

答えて

1

最初は私のフレームは、ラジオボタンで正しく開きますが、空白で、「TK」と題されている別のフレームは、あなたが二回Tk()を呼び出しているので、これがある

を表示されていることです。私は終わりの近くにそれらの1つを見る、あなたのコードの他の別のものを持っている必要があります。

最初のラジオボタンが選択されていますが、通常は中央のドットはハイフンではなくすべて選択されています。

これは、ローカル変数を使用しているためです。 "resolution"を "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ウィンドウを閉じるのを処理する正しい方法ですか?また、クラスをグローバルに保つためのヒントをありがとう。 OOPの観点から見ると、クラスがif文で1回だけ呼び出される場合、これはどのような利点がありますか?ちょうど将来の参照のために知りたい。再度、感謝します! –

+1

正しい方法は、それを破壊しないことです。それを再利用する。だから新しい "根"を作ってはいけません。古いものを使ってください。クラス定義をグローバルに保持することは、再利用したい場合(いつかしたいと思うかもしれません)、コードをきれいに保つために重要です。また、必要に応じてクラス定義を別のファイルに移動することもできます。 – Novel