web-dev-qa-db-fra.com

Exemple de code Tkinter pour plusieurs fenêtres, pourquoi les boutons ne se chargent-ils pas correctement?

J'écris un programme qui devrait:

  1. Ouvrez une fenêtre en appuyant sur un bouton.
  2. Fermez la nouvelle fenêtre en appuyant sur un autre bouton.

J'utilise des classes pour pouvoir insérer le code dans un programme plus important ultérieurement. Cependant, je ne parviens pas à charger correctement mes boutons.

import tkinter as tk

class Demo1(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self)
        self.pack()
        self.master.title("Demo 1")
        self.button1 = tk.Button(self, text = "Button 1", width = 25,
                               command = self.new_window)
        self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S)

    def new_window(self):
        self.newWindow = Demo2()

class Demo2(tk.Frame):
    def __init__(self):
        new = tk.Frame.__init__(self)
        new = tk.Toplevel(self)
        new.title("Demo 2")
        new.button = tk.Button(text = "Button 2", width = 25,
                               command = self.close_window)
        new.button.pack()

    def close_window(self):
        self.destroy()

def main():
    Demo1().mainloop()

if __== '__main__':
    main()
30
ADB

J'ai réécrit votre code de manière plus organisée et plus pratique:

import tkinter as tk

class Demo1:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
        self.button1.pack()
        self.frame.pack()

    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = Demo2(self.newWindow)

class Demo2:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
        self.quitButton.pack()
        self.frame.pack()

    def close_windows(self):
        self.master.destroy()

def main(): 
    root = tk.Tk()
    app = Demo1(root)
    root.mainloop()

if __== '__main__':
    main()

Résultat:

 Demo1 window  Demo2 window

40
Rushy Panchal

Vous devez spécifier le maître pour le deuxième bouton. Sinon, il sera emballé sur la première fenêtre. Ceci est nécessaire non seulement pour Button, mais également pour d'autres widgets et objets non-gui tels que StringVar.

Correction rapide: ajouter le cadre new comme premier argument de votre Button dans Demo2.

Peut-être mieux: Actuellement vous avez Demo2 héritant de tk.Frame mais je pense que cela a plus de sens si vous changez Demo2 pour être quelque chose comme ça,

class Demo2(tk.Toplevel):     
    def __init__(self):
        tk.Toplevel.__init__(self)
        self.title("Demo 2")
        self.button = tk.Button(self, text="Button 2", # specified self as master
                                width=25, command=self.close_window)
        self.button.pack()

    def close_window(self):
        self.destroy()

A titre de suggestion, vous ne devez importer que tkinter une fois. Choisissez l'une de vos deux premières déclarations d'importation.

11
Jared
#!/usr/bin/env python
import Tkinter as tk

from Tkinter import *

class windowclass():

        def __init__(self,master):
                self.master = master
                self.frame = tk.Frame(master)
                self.lbl = Label(master , text = "Label")
                self.lbl.pack()
                self.btn = Button(master , text = "Button" , command = self.command )
                self.btn.pack()
                self.frame.pack()

        def command(self):
                print 'Button is pressed!'

                self.newWindow = tk.Toplevel(self.master)
                self.app = windowclass1(self.newWindow)

class windowclass1():

        def __init__(self , master):
                self.master = master
                self.frame = tk.Frame(master)
                master.title("a")
                self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25 , command = self.close_window)
                self.quitButton.pack()
                self.frame.pack()


        def close_window(self):
                self.master.destroy()


root = Tk()

root.title("window")

root.geometry("350x50")

cls = windowclass(root)

root.mainloop()
4
Sumanta

Ce que vous pouvez faire est de copier le code de tkinter.py dans un fichier appelé mytkinter.py, puis procédez comme suit:

import tkinter, mytkinter
root = tkinter.Tk()
window = mytkinter.Tk()
button = mytkinter.Button(window, text="Search", width = 7,
                               command=cmd)
button2 = tkinter.Button(root, text="Search", width = 7,
                               command=cmdtwo)

Et vous avez deux fenêtres qui ne se croisent pas!