一、基本代码框架:
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 |
sticky | sticky 参数可以是 N , E , S , W , NSEW 中的一个或多个组合,分别代表北(上)、东(右)、南(下)、西(左)方向,用于控制控件在其单元格中的对齐方式和填充行为 | "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()
四、运行效果