python GUI tkinter 的页面转换方法

问题:

解决方案1的缺点:代码太长了,想具体修改某段代码得找好久。不推荐。

之后我试了下分开写,然后再LoginPage.py   RegisterPage.py在各自的py文件中 import 对方

但是这样会陷入一个循环import的错误.

ImportError: cannot import name 'RegisterPage' from 'RegisterPage' (C:\RegisterPage.py)

在网上虽然没有搜到我需要的解决办法。但是看了很多大神的想法后,我想到了一个新的解决方案。

先看方法一:

解决方案1:把所有页面放在同一.py文件中

from tkinter import *


class LoginPage(object):
    """
    登陆页面
    """

    def bf_goRegister(self):
        """
        跳转函数
        """
        self.root.destroy()
        RegisterPage()

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

        Label(self.root, text="用户").grid(row=0, column=0)
        Entry(self.root).grid(row=0, column=1, columnspan=2)
        Label(self.root, text="密码").grid(row=1, column=0)
        Entry(self.root, show="*").grid(row=1, column=1, columnspan=2)
        Button(self.root, text="登陆").grid(row=2, column=1)
        Button(self.root, text="注册", command=self.bf_goRegister).grid(row=2, column=2)

        self.root.mainloop()


class RegisterPage(object):
    """
    注册页面
    """

    def bf_goLogin(self):
        """
        跳转函数
        """
        self.root.destroy()
        LoginPage()

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

        Label(self.root, text="用户").grid(row=0, column=0)
        Entry(self.root).grid(row=0, column=1, columnspan=2)
        Label(self.root, text="密码").grid(row=1, column=0)
        Entry(self.root, show="*").grid(row=1, column=1, columnspan=2)
        Label(self.root, text="确认").grid(row=2, column=0)
        Entry(self.root, show="*").grid(row=2, column=1, columnspan=2)
        Button(self.root, text="注册").grid(row=3, column=1)
        Button(self.root, text="返回", command=self.bf_goLogin).grid(row=3, column=2, )

        self.root.mainloop()


if __name__ == '__main__':
    LoginPage()

 

解决方案2:把Page分离开来

用一个主程序控制页面跳转。

python GUI tkinter 的页面转换方法

1、文件目录

python GUI tkinter 的页面转换方法

2、Application.py   用来管理页面跳转和程序入口

def go***(self):   函数:就是跳转函数。

              首先删除上一个root,然后生成新的root。实现页面跳转。

然后,我们只需要把页面跳转函数传递给Page类中即可。

from tkinter import *
from page.LoginPage import LoginPage
from page.RegisterPage import RegisterPage


class Application(LoginPage, RegisterPage):

    def __init__(self):
        self.root = Tk()
        self.goLogin()

    def goLogin(self):
        self.root.destroy()
        LoginPage.__init__(self, goRegister=self.goRegister)

    def goRegister(self):
        self.root.destroy()
        RegisterPage.__init__(self, goLogin=self.goLogin)


if __name__ == '__main__':
    Application()

3、LoginPage.py   用Frame作为容器,Frame设置为Master的子组件。

from tkinter import *


class LoginPage(object):

    def bf_goRegister(self):
        self.goRegister()

    def __init__(self, goRegister):
        self.goRegister = goRegister

        self.root = Tk()

        Label(self.root, text="用户").grid(row=0, column=0)
        Entry(self.root).grid(row=0, column=1, columnspan=2)
        Label(self.root, text="密码").grid(row=1, column=0)
        Entry(self.root, show="*").grid(row=1, column=1, columnspan=2)
        Button(self.root, text="登陆").grid(row=2, column=1)
        Button(self.root, text="注册", command=self.bf_goRegister).grid(row=2, column=2)

        self.root.mainloop()


if __name__ == '__main__':
    root = Tk()
    LoginPage(None)
    root.mainloop()

4、RegisterPage.py   同上

from tkinter import *


class RegisterPage(object):

    def bf_goLogin(self):
        self.goLogin()

    def __init__(self, goLogin):
        self.goLogin = goLogin

        self.root = Tk()

        Label(self.root, text="用户").grid(row=0, column=0)
        Entry(self.root).grid(row=0, column=1, columnspan=2)
        Label(self.root, text="密码").grid(row=1, column=0)
        Entry(self.root, show="*").grid(row=1, column=1, columnspan=2)
        Label(self.root, text="确认").grid(row=2, column=0)
        Entry(self.root, show="*").grid(row=2, column=1, columnspan=2)
        Button(self.root, text="注册").grid(row=3, column=1)
        Button(self.root, text="返回", command=self.bf_goLogin).grid(row=3, column=2, )

        self.root.mainloop()


if __name__ == '__main__':
    root = Tk()
    RegisterPage(None)
    root.mainloop()