python_tkinter多窗口(窗体)编程示例

python_tkinter多窗口(窗体)编程示例

预备知识

图形用户界面(GUI、Graphical User Interface)是基于图形的界面,windows就是一个图形用户界面的操作系统,而DOS是基于字符命令交互的操作系统。图形用户界面由窗口构成,每个窗口都由标题、菜单、控制按钮、滚动条等元素组成。

图形用户界面(GUI)程序也成为桌面(Desktop)程序,是人机交互的图形化的程序。

Python支持多种图形界面的包(packages)较多,Python基于tkinter的GUI编程讲座 https://blog.csdn.net/cnds123/article/details/108290158

Tkinter是python 自带的图形界面的包(packages),也有人称为模块,不需要安装,直接导入 tkinter包(packages)即可使用。

下面介绍使用tkinter来开发GUI编程。

使用tkinter窗体简单只要3行代码,源码如下:

from tkinter import Tk
root=Tk()
root.mainloop()

说明:

  1. 第1行代码,就是导入tkinter模块(包),如果没有导入模块语句,那运行的结束肯定出错。
  2. 第2行代码,用Tk()方法生成一个窗体对象,我取窗体名为root,当然你也可以取别的名字,只要合乎python变量名的要求,其实窗体名,你还可以取中文名称也是可以的,但不推荐用中文名称。
  3. 最后一行代码也不可缺少,缺少最后一行代码,不报错,但窗体就不能维持住,窗体就不会出现屏幕上,最后这行代码总是放在程序代码的最后面。

特别提示,代码里各变量是区别大小写的,Tk(),其中T是大写,k是小写字母。

运行上面的代码,只能得到一个默认的大小,默认标题,默认图标的窗体,如下图所示。

python_tkinter多窗口(窗体)编程示例_第1张图片

在python的安装目录下【Python安装路径几种方法 https://blog.csdn.net/cnds123/article/details/101546889】,有一个文件夹叫Lib,进入这个目录,你会发现,你想找到的模块很多都在这里,如模块,这个Lib文件夹里对应就有一个文件夹叫tkinter,这个tkinter文件夹:

python_tkinter多窗口(窗体)编程示例_第2张图片

进入这个tkinter文件夹,看看里面的文件,有__init__.py ttk.py 等文件

在python中,把这个有__init__.py的文件夹叫“包”(package)

可以用import语句从包里导入模块的方法

相关知识可见“python之import语句的用法” https://blog.csdn.net/cnds123/article/details/118437585

前面的建立的窗体太简单了,没有什么使用价值,现实中对窗体大小、窗体的标题、窗体图标等有不同的要求。改进源码如下:

from tkinter import Tk
root=Tk()
root.title(‘第一个窗体’) #设置窗体的标题
root.geometry(‘300x150’) #设置窗体大小及位置
root.iconbitmap("./Smart.ico") #窗体图标,注意图标路径
root.mainloop()

准本已和图标

python_tkinter多窗口(窗体)编程示例_第3张图片

和代码保存在同一文件夹中。

【ico图标在线制作 http://ico.hillcloud.net/】

运行上面的代码效果如下

python_tkinter多窗口(窗体)编程示例_第4张图片

其中:

geometry(‘300x150+600+300’),宽x高+,宽x高中间是小写的字母x,+800 第一个+后的数表示窗体左边界距屏幕最左边距离,第二个+后的数表示窗体上边界距屏幕最上边距离,以像素为单位。x和+前后不可有空格。

iconbitmap("./Smart.ico"),窗体图标,我这里由于是和Python文件放在同一个目录下,所以我使用.(当前目录),也可以使用绝对路径的。

有时,我们希望窗体禁止调节窗体的大小,以下代码可以让窗体无法调节窗体大小,而且窗体的标题栏上的最大化图标会变为灰。

root.resizable(False,False)

其中第一个参数False表示窗体宽度不可调节,第二个参数表示高度不可以调节。

导入模块tkinter的方式:

第1种方法:

点击复制代码 Python

from tkinter import * # 导入模块写法1

root=Tk() # 这里写法就比较简单

root.mainloop() # 维持住窗体,等待事件的发生

第2种方法:

点击复制代码 Python

import tkinter # 导入模块写法2

root=tkinter.Tk() # 这里就必须加前缀tkinter

root.mainloop() # 维持住窗体,等待事件的发生

第3种方法:

点击复制代码 Python

import tkinter as tk # 导入模块写法3

root=tk.Tk() # 用别名tk代替tkinter作前缀

root.mainloop() # 维持住窗体,等待事件的发生

【以下是一些跟窗体有关的常用代码,基本上就是一句代码搞定一项功能,备用:

root.minsize(400, 260) # 设置窗口的最小尺寸,参数为(宽,高)

root.maxsize(750, 650) # 设置窗口的最大尺寸,参数为(宽,高)

root.state(‘zoomed’) # 最大化窗口

root.iconify() # 最小化窗口

root.attributes("-fullscreen", True) # 全屏,没有标题栏

root.state(“iconic”) # 隐藏窗体

root.withdraw() # 隐藏窗体

root.deiconify() # 让隐藏的窗体再显现

top1.transient(root) # 使窗体top1置顶于root窗口上

root.attributes("-alpha",0.8) #设置窗口透明度,范围为0到1

root.wm_attributes("-transparentcolor", “red”) # 设置某种颜色透明

root.overrideredirect(True) # 无标题栏窗体

tkinter****多窗体界面切换

★先给出一个最简单的例子

#Tkinter打开一个新窗口
from tkinter import *

windows = Tk()
windows.geometry("300x200")
def b():
    root = Tk()
    root.geometry("200x100")
    Entry(root,text="这是新的窗口").pack()
    root.mainloop()
    
Button(windows, text="打开一个新窗口", command=b).pack(pady=50)
windows.mainloop()

运行效果,参见下图:

python_tkinter多窗口(窗体)编程示例_第5张图片

★模仿密码登录

先运行form1()函数,展示的是第1个窗体——登录窗体, 密码正确,就关闭窗体1,运行函数form2(),展示窗体2。源码如下:

#模仿密码登录
from tkinter import *
from tkinter import messagebox

def form1(): # 第1个窗体:登录窗体
    def ok():
        if en1.get()=='abc123':
            root1.destroy() # 关闭登录窗体
            form2() # 进入第2个窗体:主窗体
        else:
            messagebox.showwarning("警告:","密码错!")

    root1=Tk() 
    root1.title('登录窗口')
    root1.geometry('300x150+600+200')
    la0=Label(root1,text='请输入密码:abc123')
    la0.pack()
    en1=Entry(root1)
    en1.pack()
    but1=Button(root1,text=" 确 定 ",command=ok) # 判断密码是否正确
    but1.pack(pady=5)
    but2=Button(root1,text=" 退 出 ",command=root1.destroy) # 关闭登录窗体
    but2.pack(pady=5)

    root1.mainloop() # 一直在等待接受窗体1事件,不会进入第2个窗体

def form2(): # 第2个窗体:主窗体
    root2=Tk()
    root2.title('主窗口')
    root2.geometry('300x150+600+200')
    la1=Label(root2,text='密码正确,欢迎来到主窗口')
    la1.pack()
    root2.mainloop()

form1() # 先进入第一个窗口:登录窗口

运行效果,参见下图:

python_tkinter多窗口(窗体)编程示例_第6张图片

★多模块下编程模仿密码登录

在一个模块(一个python模块就是一个python程序文件)中完成窗口的切换,一般都是因为程序比较简单,代码少,如果程序繁杂,把代码都做在一个模块里不太好管理维护代码,对完成复杂功能的程序,按功能划分为不同的模块。

对上例(模仿密码登录)的改进

在同一个目录下,有2个模块:

login.py 登录的界面,由此启动运行

home.py 主窗体

login.py****文件源码如下

#模仿密码登录——模块1
from tkinter import *
from tkinter import messagebox
from home import *  # 导入自定义home模块(home.py)

def form1(): # 第1个窗体:登录窗体
    def ok():
        if en1.get()=='abc123':
            root1.destroy() # 关闭登录窗体
            form2() # 进入第2个窗体:主窗体
        else:
            messagebox.showwarning("警告:","密码错!")

    root1=Tk() 
    root1.title('登录窗口')
    root1.geometry('300x150+600+200')
    la0=Label(root1,text='请输入密码:abc123')
    la0.pack()
    en1=Entry(root1)
    en1.pack()
    but1=Button(root1,text=" 确 定 ",command=ok) # 判断密码是否正确
    but1.pack(pady=5)
    but2=Button(root1,text=" 退 出 ",command=root1.destroy) # 关闭登录窗体
    but2.pack(pady=5)

    root1.mainloop() # 一直在等待接受窗体1事件,不会进入第2个窗体

form1() # 先进入第一个窗口:登录窗口

home.py****文件源码如下:

#模仿密码登录——模块2
from tkinter import *

def form2(): # 第2个窗体:主窗体
    root2=Tk()
    root2.title('主窗口')
    root2.geometry('300x150+600+200')
    la1=Label(root2,text='密码正确,欢迎来到主窗口')
    la1.pack()
    root2.mainloop()

运行效果,外观上和上图一样:

python_tkinter多窗口(窗体)编程示例_第7张图片

★多窗口跳转例子,实现一个主窗口切换到2个(或N个)窗体,并且可以由这些窗口返回到主窗口,源码如下:

#多窗口跳转例子

from tkinter import *

def main(): # 主窗体   
    def goto(num):
        root.destroy() # 关闭主窗体
        if num==1:            
            one() # 进入第1个窗体
        elif num==2:
            two() # 进入第2个窗体

    root=Tk() 
    root.geometry('300x150+600+200')
    root.title('登录窗口')
    but1=Button(root,text="进入 窗口1",command=lambda:goto(1)) # 进入窗口1
    but1.pack(pady=5)
    but2=Button(root,text="进入 窗口2",command=lambda:goto(2)) # 进入窗口2
    but2.pack(pady=5)

    root.mainloop() 

def one(): # 第1个窗体
    def gotomain():
        root1.destroy() # 关闭第1个窗体
        main() # 返回主窗体

    root1=Tk()
    root1.geometry('300x150+600+200')
    la1=Label(root1,text='我是第1窗口',bg='lightgreen').pack(fill=X)
    but3=Button(root1,text="返回主窗体",command=gotomain)
    but3.pack(pady=10)
    root1.mainloop()
    
def two(): # 第2个窗体
    def gotomain():
        root2.destroy() # 关闭第2个窗体
        main() # 返回主窗体
        
    root2=Tk()
    root2.geometry('300x150+600+200')
    Label(root2,text='我是第2窗口',bg='lightblue').pack(fill=X)
    but3=Button(root2,text="返回主窗体",command=gotomain)
    but3.pack(pady=10)
    root2.mainloop()

main() # 先进入主窗口

运行效果,参见下图:

python_tkinter多窗口(窗体)编程示例_第8张图片

你可能感兴趣的:(java,后端,python,开发语言)