Как контролировать отображение окон tkinter Toplevel?

1

Это краткая форма моего кода. В окне [ input ] я хочу, чтобы оно input2 только окно [ input2 ], и окно [ solve ] появится после нажатия кнопки Solve!.

В настоящее время, однако, всплывающие окна [ input2 ] и [ solve ] одновременно, а кнопка Solve! ничего не делает при нажатии.

Это мой код:

from tkinter import *

class welcome():
    def __init__(self, master): #master: root - the main window
        # welcome and introduction
        self.master=master
        self.master.geometry("500x200")

        self.welcome = Label(self.master, text="Welcome to The Bees's")
        self.welcome.pack()
        self.intro = Label(self.master, text="This is our project for Python course")
        self.intro.pack()
        self.intro2 = Label(self.master, text="This program is use for solving Linear Programming, IP, BIP, mixed... problem")
        self.intro2.pack()

        self.startbutton = Button(self.master, text="Start", bg="yellow")
        self.startbutton.pack()
        self.startbutton.config(command=self.gotoinput)

    def gotoinput(self):
        root2 = Toplevel(self.master)
        self.input1=input(root2)

Класс для окна ввода:

class input():
    def __init__(self,master):
        self.master=master
        self.master.title("Input")
        self.master.geometry("700x500")
        #cancle
        self.Canclebutton=Button(self.master,text="Cancle",command=self.master.destroy).grid(row=3,column=1)
        #OK
        self.Enterbutton=Button(self.master,text="ENTER",command=self.gotoinput2).grid(row=3,column=2)

    def gotoinput2(self):
        root3=Toplevel(self.master)
        self.input22=input2(root3)

Класс для окна ввода2:

class input2():
    def __init__(self,master):
        self.master=master
        self.master.title("Input2")
        self.master.geometry("700x500")
        # cancle
        self.Canclebutton = Button(self.master, text="Cancle", command=self.master.destroy).grid(row=0, column=0)
        # OK
        self.Solvebutton = Button(self.master, text="Solve!", command=self.gotosolve()).grid(row=0, column=1)
        print("Through")

    def gotosolve(self):
        print("gotosolve")
        root4=Toplevel(self.master)
        self.solve11=solve(root4)

Класс для окна Solve:

class solve():
    def __init__(self,master):
        self.master = master
        self.master.title("Solution")
        self.master.geometry("700x500")
        # cancle
        self.Canclebutton = Button(self.master, text="Cancle", command=self.master.destroy).grid(row=0,column=0)

Основная функция:

def main():
    # create a main window
    root = Tk()
    root.title("The Bees's")

    b = welcome(root)
    # end line
    root.mainloop()

main()
Теги:
python-3.x
tkinter
window
toplevel

1 ответ

0
Лучший ответ

Как упоминалось в комментарии command=self.gotosolve() проблема. Это должна быть command=self.gotosolve.

Тем не менее, я думаю, вы должны подойти к этому по-другому. В настоящее время вы заполняете окно верхнего уровня, а затем передаете этот класс в класс. Вместо этого вы должны просто наследовать класс от верхнего уровня. То же самое касается приветственного класса. Вероятно, это просто наследуется от Tk().

Взгляните на мой пример ниже, в котором используются классы Tk() и Toplevel.

import tkinter as tk


class Welcome(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("500x200")
        self.columnconfigure(0, weight=1)
        tk.Label(self, text="Welcome to The Bees's").grid(row=0, column=0)
        tk.Label(self, text="This is our project for Python course").grid(row=1, column=0)
        tk.Label(self, text="This program is use for solving Linear Programming, IP, BIP, mixed... problem").grid(row=2, column=0)
        tk.Button(self, text="Start", bg="yellow", command=lambda:Input(self)).grid(row=3, column=0)


class Input(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self, master)
        self.title("Input")
        self.geometry("700x500")
        tk.Button(self, text="Cancle", command=self.destroy).grid(row=3,column=1)
        tk.Button(self, text="ENTER", command=lambda: Input2(master)).grid(row=3,column=2)


class Input2(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self, master)
        self.title("Input2")
        self.geometry("700x500")
        tk.Button(self, text="Cancle", command=self.destroy).grid(row=0, column=0)
        tk.Button(self, text="Solve!", command=lambda: Solve(master)).grid(row=0, column=1)


class Solve(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self, master)
        self.master.title("Solution")
        self.master.geometry("700x500")
        tk.Button(self, text="Cancle", command=self.destroy).grid(row=0,column=0)


b = Welcome()

Этот вышеприведенный пример будет работать так, как вы ожидаете, но я думаю, что лучше было бы закрыть последний верхний уровень, прежде чем открывать следующий. На самом деле, не хочу, чтобы куча окон открывалась поверх друг друга. Это не сложно управлять мыслью, поэтому вы можете добавить ее, если хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню