2016-06-24 17 views
0

私は最初のPython Tkinter GUIで遊んできました。 あなたの下に私が作ったスクリプトがあります。正直言って、私はそれを行う方法を見つけるためにインターネット上で見てきました。Tkinter:2つのウィンドウをマージする

スクリプトを実行すると、2つの別々のウィンドウが表示されます。 1つのウィンドウで、この「ウィンドウA」を、テキストボックスと入力ボックスと1つの空のウィンドウで呼び出すと、この「ウィンドウB」と呼ぶことができます。

「ウィンドウA」で「実行」をクリックすると、phytonスクリプト(この場合はtennisMatchProbability.py)がトリガーされ、そのスクリプト(tennisMatchProbability.py)の結果が「ウィンドウB」に表示されます。

これは「tennisMatchProbability.py」の出力です。

Server Game = 0.735729230769 
Receiver Game= 0.264270769231 
Tiebreak = 0.337026817252 
Server Set = 0.205146215901 
Receiver Set= 0.794853784099 
Match Server= 0.108987765053 
Match Receiver= 0.891012234947 

私が達成したいのは、両方のウィンドウが1つのウィンドウに統合されていることです。

私は考えることができるすべてを試みてきましたが、それを理解することはできません。

from Tkinter import * 
import sys 
sys.path.append("C:\Users\Magali\Desktop\Tennis\tennisMatchProbability.py") 

class App(Frame): 
    def run_script(self): 
     sys.stdout = self 
     try: 
      del(sys.modules["tennisMatchProbability"]) 
     except: 
      ## Yeah, it's a real ugly solution... 
      pass 
     import tennisMatchProbability 
     tennisMatchProbability.matchProb() 
     sys.stdout = sys.__stdout__ 


    def build_widgets(self): 
     self.text1 = Text(self) 
     self.text1.pack(side=TOP) 


     master = Tk() 
     Label(master, text="First Name").grid(row=0) 
     Label(master, text="Last Name").grid(row=1) 
     Label(master, text="Game Score").grid(row=2) 
     Label(master, text="Set Score").grid(row=3) 

     e1 = Entry(master) 
     e2 = Entry(master) 
     e3 = Entry(master) 
     e4 = Entry(master) 
     e1.delete(0,END) 
     e2.delete(0,END) 
     e3.delete(0,END) 
     e4.delete(0,END) 


     e1.insert(10,"Novak") 
     e2.insert(10,"Djokovic") 
     e3.insert(10,"30-15") 
     e4.insert(10,"3-1") 


     e1.grid(row=0, column=1) 
     e2.grid(row=1, column=1) 
     e3.grid(row=2, column=1) 
     e4.grid(row=3, column=1) 

     Button(master, text='Run', command=self.run_script).grid(row=4, column=1, sticky=W, pady=4) 



    def write(self, txt): 
     self.text1.insert(INSERT, txt) 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.build_widgets() 


root = Tk() 
app = App(master = root) 
app.mainloop() 

答えて

2

答えは簡単です: あなたが

 master = Tk() 

で新しいTkのフレームとTclインタプリタを構築しているbuild_widgets法では次の2つのTkを(持っていることはありません)、アプリケーションで呼び出します。 解決方法は、この行を削除し、マスターのすべての出現を自己に変更することです。自己は、あなたのアプリケーションクラスを表します。これは、tk.Frameクラスを継承し、したがってメインフレームです。

また、あなたのrun_sciptの構成はかなり奇妙です。どうしてこのようにしないのですか?

def run_script(self): 
     inputs = self.read_tk_fields() 
     result = tennisMatchProbability.matchProb(inputs) 

はここにあなたのスクリプトを使って、私はGUIで結果を得ることはありません、完全なコード

from Tkinter import * 
import sys 
sys.path.append("C:\Users\Magali\Desktop\Tennis\tennisMatchProbability.py") 
import tennisMatchProbability 

class App(Frame): 

    def run_script(self): 
     inputs = self.read_tk_field() 
     result = tennisMatchProbability.matchProb(inputs) 
     self.show_prob_result(result) 

    def show_prob_result(self,result): 
     self.result_label.config(text=result) 

    def build_widgets(self): 

     Label(self, text="First Name").grid(row=0) 
     Label(self, text="Last Name").grid(row=1) 
     Label(self, text="Game Score").grid(row=2) 
     Label(self, text="Set Score").grid(row=3) 

     e1 = Entry(self) 
     e2 = Entry(self) 
     e3 = Entry(self) 
     e4 = Entry(self) 
     self.result_label = Label(self) 

     e1.insert(10,"Novak") 
     e2.insert(10,"Djokovic") 
     e3.insert(10,"30-15") 
     e4.insert(10,"3-1") 

     e1.grid(row=0, column=1) 
     e2.grid(row=1, column=1) 
     e3.grid(row=2, column=1) 
     e4.grid(row=3, column=1) 
     self.result_label.grid(row=4, column=1) 

     Button(self, text='Run', command=self.run_script).grid(row=5, column=1, sticky=W, pady=4) 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.build_widgets() 


root = Tk() 
app = App(master = root) 
app.mainloop() 
+0

私はあなたがまたする必要が – Wouter

+1

...「(マスター= TK)を、すべての変更 『削除自己』にenteries 『マスター』。しかし、私はそれを実行したときに、今 『CMDが『ハング』さ』しましたself.text1の部分を削除するか、パックをgridに変更します。また、__init__のマスターエントリを変更しないでください。 – Jannick

0

@Jannickです。あなたのスクリプトで私はCMDの結果を得て、 "実行"ボンはエラーを返します

私のコードでは、私はGUIで結果を得ます。

from Tkinter import * 
import sys 
sys.path.append("C:\Users\Magali\Desktop\Tennis\tennisMatchProbability.py") 

class App(Frame): 
    def run_script(self): 
     sys.stdout = self 
     try: 
      del(sys.modules["tennisMatchProbability"]) 
     except: 
      ## Yeah, it's a real ugly solution... 
      pass 
     import tennisMatchProbability 
     tennisMatchProbability.matchProb() 
     sys.stdout = sys.__stdout__ 


    def build_widgets(self): 
     self.text1 = Text(self) 
     self.text1.grid(row=5) 



     Label(self, text="First Name").grid(row=0) 
     Label(self, text="Last Name").grid(row=1) 
     Label(self, text="Game Score").grid(row=2) 
     Label(self, text="Set Score").grid(row=3) 

     e1 = Entry(self) 
     e2 = Entry(self) 
     e3 = Entry(self) 
     e4 = Entry(self) 
     e1.delete(0,END) 
     e2.delete(0,END) 
     e3.delete(0,END) 
     e4.delete(0,END) 


     e1.insert(10,"Novak") 
     e2.insert(10,"Djokovic") 
     e3.insert(10,"30-15") 
     e4.insert(10,"3-1") 


     e1.grid(row=0,column=1) 
     e2.grid(row=1, column=1) 
     e3.grid(row=2, column=1) 
     e4.grid(row=3, column=1) 

     Button(self,text='Run', command=self.run_script).grid(row=4, column=1, sticky=W, pady=4) 



    def write(self, txt): 
     self.text1.insert(INSERT, txt) 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.build_widgets() 


root = Tk() 
app = App(master = root) 
app.mainloop() 
+1

stdoutとprintを使用する代わりに、関数returnの引数としてtennisMatchProbabilityを使用すると、resultを使用してguiを適切に変更することができます。reslt =後のコードでは、結果を使用してGUIを変更する必要があります。 – Jannick

+0

@Jannick、あなたの答えで調整してもよろしいですか?ありがとう – Wouter

+1

私はいくつかのものを追加しましたがあなたのテニスが何を返すのか分からず、あなたが望むものがわからないので、これは単なるガイドです。 – Jannick

関連する問題