python GUI开发之tkinter

一、基本代码框架:

import tkinter as tk
from tkinter import messagebox

# 登录界面类
class LoginGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("登录界面")
        self.is_login=False
        # 创建登录界面的布局
        tk.Label(self.root, text="用户名:").grid(row=0, column=0)
        self.username = tk.Entry(self.root)
        self.username.grid(row=0, column=1)

        tk.Label(self.root, text="密码:").grid(row=1, column=0)
        self.password = tk.Entry(self.root, show="*")
        self.password.grid(row=1, column=1)

        self.login_button = tk.Button(self.root, text="登录", command=self.logincheck)
        self.login_button.grid(row=2, column=1)

    def logincheck(self):
        # 这里可以添加验证用户名和密码的逻辑
        if self.username.get() == "admin" and self.password.get() == "password":
            self.root.destroy()
            self.is_login=True
        else:
            messagebox.showerror("错误", "无效的用户名或密码")

# 主界面类
class MainWindowGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("主界面")
        # 创建主界面的布局
        tk.Label(self.root, text="欢迎来到主界面!").pack()
        tk.Button(self.root, text="退出", command=self.root.quit).pack()

# 主程序
if __name__ == "__main__":
    root = tk.Tk()
    login = LoginGUI(root)
    root.mainloop()
    if login.is_login:
        root = tk.Tk()
        MainWindow = MainWindowGUI(root)
        root.mainloop()

二、控件布局

在 Python 的 tkinter GUI 库中,有几种不同的方法来管理控件的布局,通常使用grid() 布局管理器,允许你将控件放置在一个表格一样的网格中。可以指定行和列,以及行和列的权重(weight),用于控制网格在窗口大小改变时的伸缩行为。

选项说明取值范围
row网格布局的行号int

column

网格布局的列号int
rowspan跨越多行的行数uint
columnspan跨越多列uint
padx并列组件之间的间隔uint
pady并列组件之间的间隔uint
ipadx子组件之间的间隔uint
ipady子组件之间的间隔uint
stickysticky 参数可以是 NESWNSEW 中的一个或多个组合,分别代表北(上)、东(右)、南(下)、西(左)方向,用于控制控件在其单元格中的对齐方式和填充行为"nswe","n","ns","center"

三、示例代码

import os
from tkinter import StringVar
import tkinter as tk
from tkinter import ttk
from GUI.login import userInfoGUI
from GUI.login import loginGUI

class MainWindowGUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("衔铁压装自动化产线设备——上料机")
        filepath = f'{os.path.dirname(os.path.abspath(__file__))}/haptron.ico'
        self.iconbitmap(filepath)
        self.geometry("1600x900")  # 设置主窗口大小
        self.info_text = tk.StringVar()  # 定义提示信息变量
        self.deal_text = tk.StringVar()  # 定义处理方法变量
        self.traylabel = tk.StringVar()     # 托盘编号
        self.baselabel = tk.StringVar()     # 底座编号
        self.Carrierlabel = tk.StringVar()  # 载具编号
        self.result1 = tk.StringVar()
        self.result2 = tk.StringVar()
        self.result3 = tk.StringVar()
        self.show_main_window()
        
    def show_main_window(self):
        # 创建一个LabelFrame:提示信息
        self.label_infoframe = tk.LabelFrame(self, text="提示信息",font=("Helvetica", 12))
        self.label_infoframe.grid(row=0, column=0, padx=(10,0), pady=(10,0), sticky="nsew")
        # 在LabelFrame中添加控件
        tk.Label(self.label_infoframe, text="提示信息:", relief="flat", font=("Helvetica", 15, "bold"), foreground="red").grid(row=0, column=0, padx=(20,0), pady=(15,3), sticky="ew")
        tk.Label(self.label_infoframe, textvariable=self.info_text, relief="groove", font=("Helvetica", 15, "bold"),anchor="w",foreground="black").grid(row=0, column=1, padx=(0,30), pady=(15,3), sticky="ew")       
        tk.Label(self.label_infoframe, text="处理方法:", relief="flat", font=("Helvetica", 15, "bold"), foreground="green").grid(row=1, column=0, padx=(20,0), pady=(0,15), sticky="ew")
        tk.Label(self.label_infoframe, textvariable=self.deal_text, relief="groove", font=("Helvetica", 15, "bold"),anchor="w",foreground="black").grid(row=1, column=1, padx=(0,30), pady=(0,15), sticky="ew")
        # 配置行和列的权重,使其在窗口大小变化时自动调整
        self.label_infoframe.grid_rowconfigure(0, weight=1)
        self.label_infoframe.grid_rowconfigure(1, weight=1)
        # self.label_infoframe.grid_columnconfigure(0, weight=1)
        self.label_infoframe.grid_columnconfigure(1, weight=1,minsize=850)
        
        # 创建一个LabelFrame:运行状态
        self.label_staframe = tk.LabelFrame(self, text="运行状态",font=("Helvetica", 12))
        self.label_staframe.grid(row=0, column=1, padx=10, pady=(10,0), sticky="nsew")
        tk.Label(self.label_staframe, text=" 停 止 ", relief="flat", font=("Helvetica", 50, "bold"), foreground="red").grid(row=0, column=0,rowspan=5, padx=10, pady=10, sticky="nsew")
        tk.Button(self.label_staframe, text="启 动",bg="green",font=("Helvetica", 15, "bold"),relief="ridge").grid(row=0, column=1, rowspan=3, padx=10, pady=30, sticky="nsew")
        tk.Button(self.label_staframe, text="暂 停",bg="yellow",font=("Helvetica", 15, "bold"),relief="ridge").grid(row=0, column=2, rowspan=3, padx=10, pady=30, sticky="nsew")
        tk.Button(self.label_staframe, text="停 止",bg="red",font=("Helvetica", 15, "bold"),relief="ridge").grid(row=0, column=3, rowspan=3, padx=(10,20), pady=30, sticky="nsew")
        self.label_staframe.grid_rowconfigure(0, weight=1)
        self.label_staframe.grid_columnconfigure(0, weight=1)
        self.label_staframe.grid_columnconfigure(1, weight=1,minsize=20)
        self.label_staframe.grid_columnconfigure(2, weight=1,minsize=20)
        self.label_staframe.grid_columnconfigure(3, weight=1,minsize=20)

        # 创建一个LabelFrame:物料信息
        self.label_idframe = tk.LabelFrame(self, text="物料信息",font=("Helvetica", 12))
        self.label_idframe.grid(row=1, column=0, columnspan=2, padx=10, pady=(5,0), sticky="ew")
        tk.Label(self.label_idframe).grid(row=0, column=0, padx=(30,0), pady=(10,15), sticky="ew")         #占位Label
        tk.Label(self.label_idframe, text=" 托盘编号:", relief="flat", font=("Helvetica", 15, "bold")).grid(row=0, column=1, padx=(0,0), pady=(10,15), sticky="ew")
        tk.Label(self.label_idframe, textvariable=self.traylabel, relief="groove", font=("Helvetica", 15, "bold")).grid(row=0, column=2, padx=(0,0), pady=(10,15), sticky="ew") 
        tk.Label(self.label_idframe).grid(row=0, column=3, padx=(30,0), pady=(10,15), sticky="ew")         #占位Label
        tk.Label(self.label_idframe, text=" 底座编号:", relief="flat", font=("Helvetica", 15, "bold")).grid(row=0, column=4, padx=(0,0), pady=(10,15), sticky="ew")
        tk.Label(self.label_idframe, textvariable=self.baselabel, relief="groove", font=("Helvetica", 15, "bold")).grid(row=0, column=5, padx=(0,0), pady=(10,15), sticky="ew") 
        tk.Label(self.label_idframe).grid(row=0, column=6, padx=(30,0), pady=(10,15), sticky="ew")         #占位Label
        tk.Label(self.label_idframe, text=" 载具编号:", relief="flat", font=("Helvetica", 15, "bold")).grid(row=0, column=7, padx=(0,0), pady=(10,15), sticky="ew")
        tk.Label(self.label_idframe, textvariable=self.Carrierlabel, relief="groove", font=("Helvetica", 15, "bold")).grid(row=0, column=8, padx=(0,0), pady=(10,15), sticky="ew") 
        tk.Label(self.label_idframe).grid(row=0, column=9, padx=(30,0), pady=(10,15), sticky="ew")         #占位Label  
        self.label_idframe.grid_rowconfigure(0, weight=1)
        self.label_idframe.grid_columnconfigure(0, weight=1)
        self.label_idframe.grid_columnconfigure(2, weight=1)
        self.label_idframe.grid_columnconfigure(3, weight=1)
        self.label_idframe.grid_columnconfigure(5, weight=1)
        self.label_idframe.grid_columnconfigure(6, weight=1)
        self.label_idframe.grid_columnconfigure(8, weight=1)
        self.label_idframe.grid_columnconfigure(9, weight=1)

        # 创建一个LabelFrame:物料检测
        self.label_outframe = tk.LabelFrame(self, text="物料检测",font=("Helvetica", 12))
        self.label_outframe.grid(row=2, column=0, columnspan=2, padx=10, pady=(5,0),sticky="nsew")
        self.frame1=tk.Frame(self.label_outframe)
        self.frame1.grid(row=0, column=0)
        tk.Label(self.frame1, text=" 连杆检测:", relief="flat", font=("Helvetica", 15, "bold")).grid(row=0, column=0, padx=(0,0), pady=(5,0), sticky="w")
        self.resultLabel1=tk.Label(self.frame1, text=self.result1,relief="groove", bg="green",fg="white").grid(row=0, column=1, padx=(0,0), pady=(5,0), sticky="w") 
        tk.Label(self.frame1,relief="flat").grid(row=0, column=2, padx=(30,0), pady=(5,0), sticky="w")         #占位Label
        self.frame1.grid_rowconfigure(0, weight=1)
        self.frame2=tk.Frame(self.label_outframe)
        self.frame2.grid(row=0, column=1)
        tk.Label(self.frame2, text=" 弹簧管检测:", relief="flat", font=("Helvetica", 15, "bold")).grid(row=0, column=0, padx=(0,0), pady=(5,0), sticky="w")
        self.resultLabel2=tk.Label(self.frame2, text=self.result2,relief="groove", bg="green",fg="white").grid(row=0, column=1, padx=(0,0), pady=(5,0), sticky="w") 
        tk.Label(self.frame2,relief="flat").grid(row=0, column=2, padx=(30,0), pady=(5,0), sticky="w")         #占位Label
        self.frame2.grid_rowconfigure(0, weight=1)
        self.frame3=tk.Frame(self.label_outframe)
        self.frame3.grid(row=0, column=2)
        tk.Label(self.frame3, text=" 衔铁检测:", relief="flat", font=("Helvetica", 15, "bold")).grid(row=0, column=0, padx=(0,0), pady=(5,0), sticky="w")
        self.resultLabel3=tk.Label(self.frame3, text=self.result3,relief="groove", bg="green",fg="white").grid(row=0, column=1, padx=(0,0), pady=(5,0), sticky="w") 
        tk.Label(self.frame3,relief="flat").grid(row=0, column=2, padx=(30,0), pady=(5,0), sticky="w")         #占位Label
        self.frame3.grid_rowconfigure(0, weight=1)
        tk.Label(self.label_outframe,relief="flat", bg="black").grid(row=1, column=0,padx=(5,5), pady=(0,10), sticky="nsew")
        tk.Label(self.label_outframe,relief="flat", bg="black").grid(row=1, column=1,padx=(0,0), pady=(0,10), sticky="nsew")
        tk.Label(self.label_outframe,relief="flat", bg="black").grid(row=1, column=2,padx=(5,5), pady=(0,10), sticky="nsew")
        # self.label_outframe.grid_rowconfigure(0, weight=1)
        self.label_outframe.grid_rowconfigure(1, weight=1,minsize=300)
        self.label_outframe.grid_columnconfigure(0, weight=1,minsize=400)
        self.label_outframe.grid_columnconfigure(1, weight=1,minsize=400)
        self.label_outframe.grid_columnconfigure(2, weight=1,minsize=400)
        
        # 创建一个LabelFrame:生产日志
        self.table_frame = tk.LabelFrame(self, text="生产日志",font=("Helvetica", 12))
        self.table_frame.grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky="nsew")
        self.table = ttk.Treeview(self.table_frame, columns=("Tray", "Base", "Carrier", "Good", "Bad"," "," "), show="headings")
        self.table.heading("Tray", text="托盘编号")
        self.table.heading("Base", text="底座编号")
        self.table.heading("Carrier", text="载具编号")
        self.table.heading("Good", text="良品数量")
        self.table.heading("Bad", text="不良品数量")
        self.table.grid(row=0, column=0,padx=(20,0),pady=10, sticky="nsew")
        # 操作按钮
        self.action_frame = ttk.Frame(self.table_frame)
        self.action_frame.grid(row=0, column=1, sticky="ew")
        self.delete_button = ttk.Button(self.action_frame, text="删除数据")
        self.delete_button.grid(row=0, column=0, padx=5, pady=(125,5))
        self.clear_button = ttk.Button(self.action_frame, text="清空数据")
        self.clear_button.grid(row=1, column=0, padx=5, pady=5)
        self.export_button = ttk.Button(self.action_frame, text="导出数据")
        self.export_button.grid(row=2, column=0, padx=5, pady=(5,0))
        self.table_frame.grid_columnconfigure(0, weight=1,minsize=400)

        # 配置网格布局的行和列的权重,使窗体可缩放,且按照权重缩放
        self.grid_columnconfigure(0, weight=10, minsize=1000)
        self.grid_columnconfigure(1, weight=10, minsize=200)
        # self.grid_rowconfigure(0, weight=8, minsize=110)
        # self.grid_rowconfigure(1, weight=8, minsize=60)
        self.grid_rowconfigure(2, weight=10, minsize=80)
        # self.grid_rowconfigure(3, weight=8, minsize=40)
    # 设置提示信息
    def set_info(self,info,deal): 
        self.info_text.set(info)
        self.deal_text.set(deal)  
        pass 
    # 设置编号信息
    def set_Encoding(self,traylabel,baselabel,Carrierlabel): 
        self.traylabel.set(traylabel)
        self.baselabel.set(baselabel)
        self.Carrierlabel.set(Carrierlabel)
        pass 
    # 设置检测结果
    def set_result(self,id,result,imge): 
        # colors = ["green","red"]
        #self.resultLabel1.config(bg=colors[1])
        # self.result1.set("OK")
        pass 

if __name__ == "__main__":

    # sta,name=loginGUI.open_login_window()
    # print(sta)
    # print(name)
    # if sta!='Exit':
    #     app = MainApplication()
    #     app.mainloop()
    MainWindow = MainWindowGUI() 
    MainWindow.set_info("123","456")
    MainWindow.set_Encoding("123","456","789")
    MainWindow.set_result(1,2,3)
    MainWindow.mainloop()

四、运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值