Виджет входа в Tkinter в разных кадрах - PullRequest
0 голосов
/ 17 октября 2019

Я начинаю изучать Python и GUI, использую версию 3.7. Моя проблема с виджетом входа. Я просто проверяю, как виджет diferents работает с различными рамками и не работает, как я думал, он будет работать. Поэтому я хочу сделать приложение с двумя разными страницами или более, но я начал с двух, и я хочу переключаться между ними, каждая страница будет иметь разные виджеты. В этом случае, когда я использую вызов класса Entry на второй странице или в фрейме, блок ввода также находится на главной странице, поэтому я просто хочу, чтобы блок ввода был на одной странице или фрейме. Как вы видите, я использую .pack () для записи. Я хотел бы использовать .grid (), но python выдает ошибку при попытке сделать это.

Спасибо за вашу помощь.

import tkinter as tk

LARGE_FONT = ("Verdana", 12)


class mainapp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        # self.geometry("800x600")
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (StartPage, NewData):
            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.configure(background='white')
        labeltop = tk.Label(self, text="Hello\n"
                                       "Please Select a option:",
                            bg="white", fg="green", height=4, width=30, font=LARGE_FONT)
        labeltop.grid(row=0, column=0, pady=10, padx=10, columnspan=2)

        self.logo = tk.PhotoImage(file="logo.gif")
        logolabel=tk.Label(self, image=self.logo)
        logolabel.grid(row=0, column=3)

        button1 = tk.Button(self, text="Option1", fg="White", bg="Green", height=6, width=30,
                            command=lambda: controller.show_frame(NewData))
        button1.grid(row=1, column=0, padx=1, pady=10)


class NewData(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.configure(background='white')
        label = tk.Label(self, text="Option1", font=LARGE_FONT)
        label.grid(pady=10, padx=10)

        button1 = tk.Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        E1 = tk.Entry()
        E1.pack()

        button1.grid()

app = mainapp()
app.mainloop()

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Когда вы создаете виджеты, вы должны сказать им, где они принадлежат. Когда вы делаете tk.Entry(), вы этого не делаете, поэтому по умолчанию вы входите в корневое окно.

Если вы хотите, чтобы запись находилась внутри определенной страницы, вам нужно указать эту страницу или одну из еедети в качестве мастера для записи: tk.Entry(self).

0 голосов
/ 17 октября 2019

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

...