Python | GUI | Tkinter - 3. 多窗体

5 篇文章 1 订阅

本文总结如何创建 Tkinter 多窗体。

Update: 2022 / 11 / 12



Tkinter 多窗体

组件

许多对象和子系统不喜欢接收来自多个不同线程的请求,并且在 GUI 工具包的情况下,专门需要仅使用主线程的情况并不少见。

Tkinter 设计为仅从主线程运行。即只需在主线程中运行所有 UI 代码,然后让编写者写入 Queue 对象。例如辅助线程将请求写入队列,主循环专门负责与 Tk 的所有直接交互。

为了解决这个问题,Python 架构总是将一个线程(主线程,如果必须的话)用于服务挑剔的对象或子系统。需要与所述子系统或对象交互的所有其他线程必须通过将请求排队到专用线程来获得它(如果某些请求需要结果,则可能在 返回队列 上等待结果)。这也是用于通用线程的非常完善的 Python 架构(在 Python in a Nutshell 中详细阐述了它,但这是另一个主题。

你是否有理由想要(或认为你需要)每个顶层窗口一个事件循环?单个事件循环能够处理数十个(如果不是数百或数千个)顶层窗口。而且,正如在另一个答案中所指出的那样,你不能在单独的线程中运行此事件循环。

通常来说,只需要使用一个事件循环,并让它在主线程中运行 1


示例

1.

非组件

也可以不使用 Top level 组件来模拟一下多窗体切换,将所有的代码都写在一个模块内,简单的程序也可以采取这种方法 2

比如,

  1. 把2个窗体写在2个函数里。先展示第1个窗体,通过内嵌函数判断是否满足要求,
  • 如果满足要求,则关闭窗体1并随即开启第2个窗体;
  • 如果不满足要求,则直接退出窗体1,窗体2也不会显示。
  1. 由一个主窗口切换到2个(或N个)窗体,同时也可以由这些窗口返回到主窗口来。

示例

1. 一个窗体一个函数
from tkinter import *

def one():
    def ok():
        if en1.get() == '123456':
            root1.destroy()                                   	 # close win 1
            two()                                              	 # enter win 2

    root1 = Tk()
    root1.title('win 1')
    root1.geometry('300x150+888+444')
    Label(root1, text='Please input your password.', bg='lightgreen').pack(fill=X)
    en1 = Entry(root1)
    en1.pack()
    butone1 = Button(root1, text="Submit", command=ok)     
    									# whether satisfy the condition or not
    butone1.pack(pady=5)

    root1.mainloop()

def two():
    root2 = Tk()
    root2.title('win 2')
    root2.geometry('300x150+888+444')

    Label(root2, text='This is win 2.', bg='lightblue').pack(fill=X)

    root2.mainloop()

if __name__ == '__main__':
    one()

运行时效果如下所示:

在这里插入图片描述


2. 一个主窗体切换多个二级窗口
from tkinter import *

def main():                                                # enter main
    def goto(num):
        root.destroy()                                     # destroy main win
        if num == 1:
            one()                                          # enter win 1
        elif num == 2:
            two()                                          # enter win 2

    root = Tk()  
    root.title('Main')
    butmain1 = Button(root, text="Go into win 1", command=lambda: goto(1))  
    													   # enter win 1
    butmain1.pack(pady=5)
    butmain2 = Button(root, text="Go into win 2", command=lambda: goto(2))  
    													   # enter win 2
    butmain2.pack(pady=5)

    root.mainloop()
    

def one():
    def gotomain():
        root1.destroy()                                    # close win 1
        main()                                             # enter main

    root1 = Tk()
    root1.geometry('300x150+888+444')
    root1.title('win 1')
    Label(root1, text='This is win 1.', bg='lightgreen').pack(fill=X)
    butone1 = Button(root1, text="Back to main", command=gotomain)
    butone1.pack(pady=10)
    root1.mainloop()


def two():
    def gotomain():
        root2.destroy()                                    # close win 2
        main()                                             # enter main

    root2 = Tk()
    root2.geometry('300x150+888+444')
    root2.title('win 2')
    Label(root2, text='This is win 2.', bg='lightblue').pack(fill=X)
    buttwo1 = Button(root2, text="Back to main", command=gotomain)
    buttwo1.pack(pady=10)
    root2.mainloop()


if __name__ == '__main__':
    main()

运行时效果如下所示:

在这里插入图片描述


参考链接


  1. python - 创建第二个 Toplevel 小部件时,线程 Tkinter 脚本崩溃 ↩︎

  2. tkinter,在同一模块下的多窗体操作,不用Toplevel组件,用函数 ↩︎

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个VB6的IDE插件(Addin),使用VB6的IDE直接设计Python的界面。 Python和VB都是能让人快乐的编程语言,我使用了Python之后,很多自己使用的工具都使用Python开发或改写了,因为最终实现的Python代码实在太短了(相比VB),有时候Python一行代码就可以实现VB一个函数的功能。 Python就是这种让人越用越开心的语言。 不过说实在,使用Python开发GUI界面还是麻烦了一些了,自带的标准库Tkinter使用起来非常简单,不过对于习惯了VB拖放控件完成界面设计的同学来说,还是不够人性化。TK也有一个工具叫GUI Builder,不过它使用Layout布局,不够直观,而且界面简陋,用起来也不爽。 至于PyQt/wxPythonGUI库,尽管有可视化设计工具,但总感觉做一般的轻量级应用是杀鸡用牛刀,学习起来也比较复杂,而且不够环保,不够低碳,要带一个很大的库,需要目标机器上夜同样安装了PyQt/wxPython,做不了绿色软件。 所以最终的结果是我更喜欢Tkinter,用起来很简单,绿色环保,真正的跨平台,一个py文件到处运行(担心泄密就编译成pyc)。 很多人都认为TK的界面不够美观,不过导入Python自带的标准TTK主题库,界面非常Native,不输PyQt/wxPython。 此Addin默认启用TTK支持,也可选择关闭。 总而言之,轻量级GUI,TK+TTK足够。 使用此Addin,你可以不用写一句代码就可以生成一个完整可运行的PythonGUI界面,支持python 2.X和3.X。 安装方法:将压缩包解压到你希望的目录,然后执行Setup.exe完成注册插件过程,打开VB6就可以用了。 在VB窗体上设计完成界面后(你可以大胆的设置各控件的属性,Addin尽量将其翻译为tkinter的控件属性),点工具栏上的VisualTkinter(图标为一片橙红色羽毛),再点'生成代码'按钮,即可生成可运行的Python代码,可以拷贝至剪贴板或保存至文件。 一般情况下你可以不用再改变tkinter的控件属性,但是如果你熟悉tkinter,需要更多的控制,可以一一核对各属性,并且修改,再生成代码。 除了用来设计界面外,此ADDIN内置的各控件属性列表可以做为编程参考,比较完整,除了极少数我认为大多数人都不用的属性外,属性定义基本上是我从官方的tkinter文档直接翻译的。 如果还没有VB6,网上找一个VB6精简版即可(建议使用12M的版本,6M的版本也可以使用,不过工具栏图标无法显示,可以通过菜单执行此插件)。 经过网友测试,完美支持WinXP,Windows 7, Windows 8。
### 回答1: Python GUI Tkinter项目是使用Python编程语言Tkinter库创建的图形用户界面项目。它可以用于创建各种桌面应用程序,如文本编辑器、计算器、游戏等。TkinterPython标准库中的一个GUI工具包,它提供了创建窗口、按钮、标签、文本框等常见GUI组件的方法。使用Tkinter可以快速创建简单的GUI应用程序,也可以通过自定义组件和布局来创建更复杂的应用程序。 ### 回答2: Python GUI是一种图形用户界面,通常用于创建图形、图表、工具栏等。Tkinter是一个流行的Python库,专门用于创建图形用户界面的Python GUI。 使用Tkinter创建Python GUI的项目需要灵活性和创新性。创建Tkinter项目的第一步是定义窗口的类型和大小。通过设置窗口的类型,可以指定它是一个对话框、标题窗口、弹出窗口或模式窗口,也可以指定窗口的大小、颜色和其他窗口属性。 接下来,您需要选择和添加控件,例如按钮、标签、文本框、下拉列表框和单选按钮。将这些控件添加到窗口后,可以像设置窗口属性一样设置它们的属性。 控件之间的交互和数据传输是Tkinter项目的重点。通过将控件与函数连接起来,可以实现按钮点击、文本框输入、下拉列表框选择等操作。对于复杂的应用程序,可以使用导航窗格、切换窗口和其他控件来组织布局,使其易于导航和使用。 为了使应用程序更加交互和响应性,可以添加功能、插件和内置任务,例如数据存储、数据处理、输入验证和结果导出。通过这些拓展,创建的Tkinter项目可以具有更广泛的应用范围。 总的来说,Tkinter非常适合创建Python GUI项目,因为它易于使用,具有良好的支持和资源,并且可以与其他Python库和框架集成。谁都可以使用Tkinter开发掌握一项技能,进行窗体界面开发。 ### 回答3: Python GUI tkinter项目是一种基于python的图形用户界面(GUI)工具集,可以帮助开发者构建具有互动性和可视化效果的应用程序。该工具集提供了各种控件来创建各种强大的GUI应用程序,比如按钮、标签、文本框、下拉列表和复选框等。 该工具集既简单易用,又灵活性高,适合于开发各种类型的应用程序,比如文本编辑器、数据库管理器、计算器等。此外,它还支持多种操作系统(如Windows,iOS,Linux)和编程语言(如C,C++,Java),因此可以轻松地在不同平台上使用。 Python GUI tkinter项目有几个主要的特点,包括: 1. 简单易用:Python GUI tkinter项目提供了各种易于使用的控件和工具,帮助开发者很容易地构建图形界面,省去了复杂的GUI编程过程。 2. 相对灵活性高:Python GUI tkinter项目非常灵活,提供了丰富的选项和配置来满足不同需求。开发者可以使用各种控件、布局、颜色等构建独特的应用程序。 3. 可移植性强: 由于Python GUI tkinter项目可以在多个操作系统和编程语言中使用,因此可以很方便地移植到不同的平台并在不同的环境下使用。 Python GUI tkinter项目的主要优势在于其易用性和灵活性。虽然它可能不如其他图形用户界面工具集(如QT或wxWidgets)功能丰富,但它是一个强大而又简单的工具,适用于各种应用程序的开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值