【问题标题】:Tkinter: Merging 2 windowsTkinter:合并 2 个窗口
【发布时间】:2016-06-24 08:38:29
【问题描述】:

我一直在玩我的第一个 Python Tkinter GUI。 您可以在下面找到我制作的脚本。老实说,我已经在互联网上四处寻找,以了解如何做到这一点。

当我现在运行我的脚本时,我得到了 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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    答案很简单: 在 build_widgets 方法中,您正在构建一个新的 Tk 框架和 tcl 解释器

            master = Tk()
    

    您的应用程序中不应该有两个 Tk() 调用。 解决方案是删除此行并将每次出现的 master 更改为 self。 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()
    

    【讨论】:

    • 我已删除“master = Tk()”并将所有“master”输入更改为“self”。但是当我现在运行它时,“CMD”正在“挂起”....
    • 您还必须删除 self.text1 部分或将包更改为网格。此外,您不应更改 init 中的主条目
    【解决方案2】:

    @Jannick,用你的脚本我没有在 GUI 中得到结果。使用您的脚本,我在 CMD 中得到结果,并且“运行”bottun 给出了错误

    使用下面的代码,我可以在 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()
    

    【讨论】:

    • 我想表明您应该而不是使用标准输出和打印,这是一个非常糟糕的解决方案,将您在tennisMatchProbability 中生成的结果作为函数返回参数传递。您可以使用 result 然后相应地更改您的 gui。所以在我的代码中 reslt = ... 你应该使用 result 来改变你想要的 GUI。
    • @Jannick,那么你的代码会是什么样子呢?你介意在你的答案中调整它吗?谢谢
    • 我添加了一些东西,但由于我不知道您的网球物品会返回什么,也不知道您想要什么,这只是一个指南。
    • 您应该更改您的tennisMatchProbability 脚本以将这些值作为函数返回而不是打印出来。
    • 因为我只是为你写的。如果您的网球内容不需要输入,只需将其删除即可。
    猜你喜欢
    • 2018-02-03
    • 2014-01-02
    • 1970-01-01
    • 2021-07-16
    • 2018-05-11
    • 2013-01-08
    • 2023-04-06
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多