Есть ли способ отобразить класс в Python tkinter как фрейм, чтобы можно было добавить другие вещи? - PullRequest
0 голосов
/ 13 мая 2019

Я хочу иметь окно tkinter, которое отображает и хронометр, и судоку.Хронометр - это класс, так как я могу добавить его в окно, в котором отображается судоку?

Мне уже удалось получить два отдельных окна, но я не смог создать одно с обеими вещами.

def GUI4x4(dif):  #This function gets just called from other place

    # What I want is to be able to display this class
    # Cronometer in the main window that's created below

    class Cronometer(): 

        ...

        def __init__(self):
            self.crono=Tk()

            self.tiempo = StringVar()
            self.tiempo.set("00:00:00")

            self.label = Label(self.crono,textvariable=self.tiempo, bg="white")
            self.label.grid(column=0,row=0)
            self.label.configure(font=("Times 13 bold"))                
            self.btnI = Button(self.crono, bg="white", text="Start",command=self.iniciarT,font=("Times 11"))
            self.btnI.grid(pady=3,column=0,row=1)
            self.btnP = Button(self.crono, bg="white", text="Pause",command=self.pausarT,font=("Times 11"))
            self.btnP.grid(pady=3,column=0,row=2)
            self.btnR = Button(self.crono, bg="white", text="Restart",command=self.reiniciarT,font=("Times 11"))        
            self.btnR.grid(pady=3,column=0,row=3)


    GUI = Tk() # This creates the main window, and places
               # 34 buttons in it
    ...

    # Defining the Buttons
    btn00 = Button(GUI, text=Tablero[0][0], width=5, height=3, activebackground="lime")
    btn01 = Button(GUI, text=Tablero[0][1], width=5, height=3, activebackground="lime")
    btn02 = Button(GUI, text=Tablero[0][2], width=5, height=3, activebackground="lime")

    ...

    btn33 = Button(GUI, text=Tablero[3][3], width=5, height=3, activebackground="lime")


    #Placing the 34 buttons
    btn00.grid(row=0, column=0)
    btn01.grid(row=0, column=1)
    btn02.grid(row=0, column=2)
    ...
    btn33.grid(row=3, column=3)

1 Ответ

1 голос
/ 13 мая 2019

Стандартный способ справиться с этим с помощью tkinter заключается в том, что каждый «виджет» в приложении - это собственный класс, основанный на виджете Frame tkinter, один класс для хронографа, другой для игры судоко. Там может быть даже основной класс приложения.

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

Довольно простой пример ниже

import tkinter as tk

class Chromometer(tk.Frame):
    def __init__(self,master=None,**kw):
        tk.Frame.__init__(self,master=master,**kw)
        self.tiempo = tk.StringVar()
        self.tiempo.set("00:00:00")
        self.label = tk.Label(self,textvariable=self.tiempo, bg="white")
        self.label.grid(column=0,row=0)

class Sudoko(tk.Frame):
    def __init__(self,master=None,**kw):
        tk.Frame.__init__(self,master=master,**kw)
        self.label = tk.Label(self,text="Sudoko", bg="white")
        self.label.grid(column=0,row=0)


class MainApp(tk.Frame):
    def __init__(self,master=None,**kw):
        tk.Frame.__init__(self,master=master,**kw)
        self.chrono = Chromometer(master=self)
        self.chrono.grid()
        self.sudoko = Sudoko(master=self)
        self.sudoko.grid()

if __name__ == '__main__':
    root = tk.Tk()
    app = MainApp(master=root)
    app.grid()
    root.mainloop()

Каждый класс будет иметь свои собственные методы для выполнения функций, необходимых каждому. Класс chromo / chrono будет иметь метод для обновления таймера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...