2016-06-24 85 views
0

我一直在玩我的第一個Python Tkinter GUI。 在你的下方找到我製作的腳本。一定要誠實,我已經在互聯網上看了一下,看看如何去做。Tkinter:合併2個窗口

當我運行我的腳本現在我得到2個獨立的窗口。 一個窗口,讓我們稱之爲「窗口A」,用我的文本和輸入框以及一個空窗口,讓我們稱之爲「窗口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 

我想實現的是將兩個窗口合併爲一個窗口。

我一直在努力,我能想到的,但不能弄明白一切。

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

答案很簡單: 在build_widgets方法,則需要構建新的框架Tk的和TCL解釋器

 master = Tk() 

你永遠不應該有兩個TK()調用您的應用程序。 解決的辦法是刪除這一行,並將主人的每一次出現改爲自己。 Self代表您的應用程序類,它從tk.Frame類繼承,因此是您的主要框架。

而且你run_scipt的建設是相當怪異。你爲什麼不這樣做?

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

下面是完整的代碼

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

我已經刪除「主= TK(),並改變了所有的‘主人’enteries‘自我’。但是,當我現在運行‘CMD’被‘掛’...... – Wouter

+1

你還必須除去self.text1部分或更改包到電網。此外,你不應該改變__init__ – Jannick

0

@Jannick,用你的劇本我沒有得到在GUI中的結果。隨着你的腳本,我得到的結果和CMD「運行」 bottun給出了一個錯誤

我的代碼下面我得到的圖形用戶界面的結果。

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

主項,我想指出,你應該而不是使用標準輸出和印刷,這是一個非常糟糕的解決方案通過要生成的結果tennisMatchProbability作爲一個函數返回參數,你可以使用result然後相應地改變你的gui,所以在reslt =之後的代碼中...你應該使用結果來改變你的圖形用戶界面 – Jannick

+0

@Jannick,那麼你的代碼如何看起來像嗎?你介意在你的答案中調整它嗎?謝謝 – Wouter

+1

我添加了一些東西,但因爲我不知道你的網球東西會回來,我不知道你想要什麼,這只是一個指導。 – Jannick