Переключайтесь между кадрами в ткинтер.Один с вкладками, один без - PullRequest
0 голосов
/ 17 октября 2018

У меня есть программа с несколькими вкладками в нескольких файлах, с одним файлом для каждого, который я получил от здесь и немного манипулировал им, поскольку он не работал в:

main.py

import tkinter as tk
from tkinter import ttk

from tab1 import *
from tab2 import *    

class MainApplication(tk.Frame):
  def __init__(self, parent, *args, **kwargs):
    tk.Frame.__init__(self, parent, *args, **kwargs)

notebook = ttk.Notebook(parent)

Typ1frame = Typ1(notebook)
Typ2frame = Typ2(notebook)

notebook.add(Typ1frame, text='TAB1')
notebook.add(Typ2frame, text='TAB2')
notebook.pack()

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

tab1.py

import tkinter as tk
from tkinter import ttk

class Typ1(tk.Frame):
  def __init__(self, parent, *args, **kwargs):
    tk.Frame.__init__(self, parent, *args, **kwargs)
    shell_frame=tk.LabelFrame(self, text="Sample Label Frame", padx=5,pady=5)
    shell_frame.grid(row=0,column=0,padx=5,pady=5)

tab2.py

import tkinter as tk
from tkinter import ttk

class Typ2(tk.Frame):
  def __init__(self, parent, *args, **kwargs):
    tk.Frame.__init__(self, parent, *args, **kwargs)
    shell_frame=tk.LabelFrame(self, text="Sample Label Frame", padx=5,pady=5)
    shell_frame.grid(row=0,column=0,padx=5,pady=5)

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

Если возможноможет ли страница входа быть отдельным файлом.

Как бы я это сделал, или вы могли бы подсказать, как это выяснить самостоятельно?

Заранее спасибо.

1 Ответ

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

Оказывается, ваша проблема проста в размере.LabelFrame в основном сидит с нулевым размером, потому что вы ничего не добавили к кадру.Поэтому, чтобы исправить это, добавьте ширину и высоту, чтобы изменить размер LabelFrame и проблема штанги решена.

Как только вы начнете заполнять эти LabelFrame виджетами, вам больше не понадобится форматирование размера.

import tkinter as tk
from tkinter import ttk

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        notebook = ttk.Notebook(parent)

        notebook.add(Typ1(notebook), text='TAB1')
        notebook.add(Typ2(notebook), text='TAB2')
        notebook.pack()

class Typ1(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        shell_frame=tk.LabelFrame(self, text="Sample Label Frame", padx=5, pady=5, width=200, height=200)
        shell_frame.grid(row=0,column=0,padx=5,pady=5)

class Typ2(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        shell_frame=tk.LabelFrame(self, text="Sample Label Frame", padx=5,pady=5, width=200, height=200)
        shell_frame.grid(row=0,column=0,padx=5,pady=5)

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

Результаты:

enter image description here

Вы также можете просто наследовать от LabelFrame вместо Frame в своем классе, чтобы получить те же результатыwith less.

Пример:

import tkinter as tk
from tkinter import ttk

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        notebook = ttk.Notebook(parent)

        notebook.add(Typ1(notebook), text='TAB1')
        notebook.add(Typ2(notebook), text='TAB2')
        notebook.pack()

class Typ1(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, text="Sample Label Frame", padx=5, pady=5, width=200, height=200)
        self.grid(row=0,column=0,padx=5,pady=5)

class Typ2(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, text="Sample Label Frame", padx=5, pady=5, width=200, height=200)
        self.grid(row=0,column=0,padx=5,pady=5)

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

Чтобы ответить на ваши комментарии ниже, вы должны интегрировать обмен фреймами со страницей входа в систему.

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(LoginPage)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.grid(row=0, column=0)

class LoginPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master
        tk.Label(self, text="Username: ").grid(row=0, column=0)
        tk.Label(self, text="Password: ").grid(row=1, column=0)
        self.un_entry = tk.Entry(self)
        self.un_entry.grid(row=0, column=1)
        self.pw_entry = tk.Entry(self)
        self.pw_entry.grid(row=1, column=1)

        self.pw_entry.bind("<Return>", self.check_login)
        tk.Button(self, text="Login", command=self.check_login).grid(row=2, column=0)


    def check_login(self, event=None):
        if self.un_entry.get() == "Mike" and self.pw_entry.get() == "pass":
            self.master.switch_frame(MainApplication)

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        notebook = ttk.Notebook(parent)

        notebook.add(Typ1(notebook), text='TAB1')
        notebook.add(Typ2(notebook), text='TAB2')
        notebook.grid(row=0, column=0)

class Typ1(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, text="Sample Label Frame", padx=5, pady=5, width=200, height=200)
        self.grid(row=0,column=0,padx=5,pady=5)

class Typ2(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, text="Sample Label Frame", padx=5, pady=5, width=200, height=200)
        self.grid(row=0,column=0,padx=5,pady=5)

if __name__ == "__main__":
    App().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...