GUI编程(Python版)

什么是GUI(Graphical User Interface):

GUI(图形用户界面)允许用户使用图形控件(如图标、按钮和对话框)与操作系统和其他程序进行交互。


tkinter模块

15个tkinter控件(摘自菜鸟教程)

控件描述
Button按钮控件;在程序中显示按钮。
Canvas画布控件;显示图形元素如线条或文本
Checkbutton多选框控件;用于在程序中提供多项选择框
Entry输入控件;用于显示简单的文本内容
Frame框架控件;在屏幕上显示一个矩形区域,多用来作为容器
Label标签控件;可以显示文本和位图
Listbox列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
Menubutton菜单按钮控件,用于显示菜单项。
Menu菜单控件;显示菜单栏,下拉菜单和弹出菜单
Message消息控件;用来显示多行文本,与label比较类似
Radiobutton单选按钮控件;显示一个单选的按钮状态
Scale范围控件;显示一个数值刻度,为输出限定范围的数字区间
Scrollbar滚动条控件,当内容超过可视化区域时使用,如列表框。.
Text文本控件;用于显示多行文本
Toplevel容器控件;用来提供一个单独的对话框,和Frame比较类似
Spinbox输入控件;与Entry类似,但是可以指定输入范围值
PanedWindowPanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。
LabelFramelabelframe 是一个简单的容器控件。常用与复杂的窗口布局。
tkMessageBox用于显示你应用程序的消息框。

创建程序主窗体

import tkinter


def main():
    main_window=tkinter.Tk() # 创建程序主窗体

    tkinter.mainloop() # 让程序主窗体一直运行,直到你主动×掉它


main()
    
或者

import tkinter


class MyGUI:
    def __init__(self):
        self.main_window=tkinter.Tk()
  
        tkinter.mainloop()


my_gui=MyGUI()

Label控件

用于在窗体中显示文本

import tkinter


class MyGUI:
    def __init__(self):
        self.main_window=tkinter.Tk()

        self.label=tkinter.Label(self.main_window,text='Hello world!')  # 第一参数是引用root(self.main_window)控件,第二参数是在窗体上写什么值 
        self.label.pack()  # pack()确定控件在窗体的位置,以及控件可用,pack()函数有个参数叫side(从那边开始显示文本内容)。

        tkinter.mainloop()


my_gui=MyGUI()


Frame控件

一个包容其他控件的容器

import tkinter


class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        self.label1 = tkinter.Label(self.top_frame, text='Winken')
        self.label2 = tkinter.Label(self.top_frame, text='Blinken')
        self.label3 = tkinter.Label(self.top_frame, text='Nod')

        self.label1.pack(side='top')
        self.label2.pack(side='top')
        self.label3.pack(side='top')

        self.label4 = tkinter.Label(self.bottom_frame, text='Winken')
        self.label5 = tkinter.Label(self.bottom_frame, text='Blinken')
        self.label6 = tkinter.Label(self.bottom_frame, text='Nod')

        self.label4.pack(side='left')
        self.label5.pack(side='left')
        self.label6.pack(side='left')

        self.top_frame.pack()
        self.bottom_frame.pack()

        tkinter.mainloop()


my_gui = MyGUI()

Button控件和信息对话框

消息对话框是一个简单的窗体,向用户显示一条消息,并具有一个OK按钮用于消除该对话框。

Button控件是一种在用户单击是可以触发事件操作的控件。

import tkinter
import tkinter.messagebox


class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        self.my_button=tkinter.Button(self.main_window,text='Click me!',command=self.do_something)
        self.quit_button=tkinter.Button(self.main_window,text='Quit',command=self.main_window.destroy)

        self.my_button.pack()
        self.quit_button.pack()

        tkinter.mainloop()

    def do_something(self):
        tkinter.messagebox.showinfo('Response','Thanks for clicking the button')


my_gui = MyGUI()

使用Entry控件获得输入

Entry控件是一个用户可以输入文本的矩形区域。

import tkinter
import tkinter.messagebox


class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        self.prompt_label=tkinter.Label(self.top_frame,text='Enter a distance in kilometers:')
        self.kilo_entry=tkinter.Entry(self.top_frame,width=10)

        self.prompt_label.pack(side='left')
        self.kilo_entry.pack(side='left')

        self.calc_button=tkinter.Button(self.main_window,text='Convert',command=self.convert)
        self.quit_button=tkinter.Button(self.main_window,text='Quit',command=self.main_window.destroy)

        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')

        self.top_frame.pack()
        self.bottom_frame.pack()

        tkinter.mainloop()

    def convert(self):
        kilo=float(self.kilo_entry.get())
        miles=kilo*0.6214
        tkinter.messagebox.showinfo('Results','{} kilometers is equal to {:.1f} miles'.format(kilo,miles))   # format保留几位小数的表示法别忘记!


my_gui = MyGUI()


使用标签显示输出

当一个StringVar对象与一个Label控件相关联时,Label控件显示存储在StringVar对象中的任何数据。

import tkinter


class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        self.top_frame = tkinter.Frame(self.main_window)
        self.mid_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        self.prompt_label=tkinter.Label(self.top_frame,text='Enter a distance in kilometers:')
        self.kilo_entry=tkinter.Entry(self.top_frame,width=10)

        self.prompt_label.pack(side='left')
        self.kilo_entry.pack(side='left')

        self.descr_label = tkinter.Label(self.mid_frame,text='Converted to miles:')
        self.value = tkinter.StringVar()
        self.miles_label = tkinter.Label(self.mid_frame,textvariable=self.value)

        self.descr_label.pack(side='left')
        self.miles_label.pack(side='left')

        self.calc_button = tkinter.Button(self.main_window,text='Convert',command=self.convert)
        self.quit_button = tkinter.Button(self.main_window,text='Quit',command=self.main_window.destroy)

        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')

        self.top_frame.pack()
        self.mid_frame.pack()
        self.bottom_frame.pack()

        tkinter.mainloop()

    def convert(self):
        kilo=float(self.kilo_entry.get())
        miles=kilo*0.6214
        self.value.set(miles)


my_gui = MyGUI()


Radio按钮和Check按钮

Radio按钮通常以组的形式出现有两个或两个以上选项并允许用户从几种选项中选择其中一项。Check按钮可以单独或分组显示,每个选项都 是/否 或 开/关 选择。

import tkinter
import tkinter.messagebox


class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        self.radio_var=tkinter.IntVar()
        self.radio_var.set(1)

        self.rb1=tkinter.Radiobutton(self.top_frame,text='Option 1',variable=self.radio_var,value=1)
        self.rb2=tkinter.Radiobutton(self.top_frame,text='Option 2',variable=self.radio_var,value=2)
        self.rb3=tkinter.Radiobutton(self.top_frame,text='Option 3',variable=self.radio_var,value=3)

        self.rb1.pack()
        self.rb2.pack()
        self.rb3.pack()

        self.ok_button = tkinter.Button(self.bottom_frame,text='OK',command=self.show_choice)
        self.quit_button = tkinter.Button(self.bottom_frame,text='Quit',command=self.main_window.destroy)

        self.ok_button.pack(side='left')
        self.quit_button.pack(side='left')

        self.top_frame.pack()
        self.bottom_frame.pack()

        tkinter.mainloop()

    def show_choice(self):
        tkinter.messagebox.showinfo('Selection','You selected option'+str(self.radio_var.get()))


my_gui = MyGUI()

import tkinter
import tkinter.messagebox


class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        self.cb_var1 = tkinter.IntVar()
        self.cb_var2 = tkinter.IntVar()
        self.cb_var3 = tkinter.IntVar()

        self.cb_var1.set(0)
        self.cb_var2.set(0)
        self.cb_var3.set(0)

        self.cb1=tkinter.Checkbutton(self.top_frame,text='Option 1',variable=self.cb_var1)
        self.cb2=tkinter.Checkbutton(self.top_frame,text='Option 2',variable=self.cb_var2)
        self.cb3=tkinter.Checkbutton(self.top_frame,text='Option 3',variable=self.cb_var3)

        self.cb1.pack()
        self.cb2.pack()
        self.cb3.pack()

        self.ok_button = tkinter.Button(self.bottom_frame,text='OK',command=self.show_choice)
        self.quit_button = tkinter.Button(self.bottom_frame,text='Quit',command=self.main_window.destroy)

        self.ok_button.pack(side='left')
        self.quit_button.pack(side='left')

        self.top_frame.pack()
        self.bottom_frame.pack()

        tkinter.mainloop()

    def show_choice(self):
        self.message = 'You selected:\n'

        if self.cb_var1.get()==1:
            self.message = self.message+'Option 1\n'
        if self.cb_var2.get()==1:
            self.message = self.message+'Option 2\n'
        if self.cb_var3.get()==1:
            self.message = self.message+'Option 3\n'

        tkinter.messagebox.showinfo('Selection',self.message)


my_gui = MyGUI()

补充:

## Python的GUI

**一般来说写GUI肯定是好几个界面,最好把每一个界面都写成类。**

parent_window是传入的参数可以理解为:tkinter.TK()

```
#这俩个写在类初始化__init__(self,parent_window)的开头

parent_window.update()      # 之前数据库一直连接不上,查了资料说加上这句话就可以了。我的理解就是它能够更新界面,使数据显示。
parent_window.destroy()      # 销毁子界面
```

```
window=tkinter.TK()


window.title() 界面标题


window.geometry('widthxheight+x1+y1') #x1,y1 即主界面在电脑屏幕中出现的位置,一般是左上角那个位置


window.destroy() #界面销毁


控件.place(x=,y=)  # place是用来确定控件位置,以及让控件可用, x,y是指button控件在界面内部的位置。 pack()也行


window.mainloop() # 让程序主窗体一直运行,直到你主动×掉它


command——>可以用匿名函数参数 #command=lambda: 函数/类(参数)


连接数据库和别的一样,注意
#eg:
#value=tkinter.StringVar()
#sql="sql语句" %(value.get())


window.protocol("WM_DELETE_WINDOW", back)  # 捕捉右上角关闭点击
def back():
    Another_window(window)  # 显示另一个窗口 销毁本窗口
```

import pymysql.cursors
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from tkinter import *
import tkinter.messagebox as messagebox


# 主页面
class StartPage:
    def __init__(self, parent_window):
        parent_window.update()  # 之前数据库一直连接不上,查了资料说加上这句话就可以了。我的理解就是它能够更新界面,使数据显示。
        parent_window.destroy()  # 销毁子界面

        self.window = tk.Tk()
        self.window.title('仓库管理系统')
        self.window.geometry('700x600+150+150')  # 700*600是width*height 150:分别是x,y 即主界面在电脑屏幕中出现的位置,一般是左上角那个位置

        # 显示仓库管理系统文本
        label = Label(self.window, text="仓库管理系统", font=("楷体", 30))
        label.pack(pady=10)  # y轴间距,以像素计

        # 入库,出库,查询仓库清单,退出系统四个操作
        # Button控件是一种在用户单击是可以触发事件操作的控件。
        # 参数:首先也需要确定button控件是在哪里运行的,text,font同label控件,command是指在你鼠标点击这个button时执行的函数,width和height是指控件的宽高。fg是指字体颜色,bg是指背景色
        # place是用来确定button控件位置,以及让控件可用, x,y是指button控件在界面内部的位置
        Button(self.window, text="入库操作", font=tkFont.Font(size=16), command=lambda: Warehousing(self.window), width=20,
               height=2, fg='white', bg='gray').place(x=100, y=300)
        Button(self.window, text="仓库查询", font=tkFont.Font(size=16), command=lambda: Warehousing_enquire(self.window), width=20,
               height=2, fg='white', bg='gray').place(x=400, y=300)
        Button(self.window, text="出库操作", font=tkFont.Font(size=16), command=lambda: chuku(self.window), width=20,
               height=2, fg='white', bg='gray').place(x=100, y=400)
        Button(self.window, text="退出系统", font=tkFont.Font(size=16), command=self.window.destroy, width=20,
               height=2, fg='white', bg='gray').place(x=400, y=400)

        # 让程序主窗体一直运行,直到你主动×掉它
        self.window.mainloop()


# 入库操作页面
class Warehousing:
    def __init__(self, parent_window):
        parent_window.update()
        parent_window.destroy()  # 销毁子界面

        self.window = tk.Tk()
        self.window.title('入库操作')
        self.window.geometry('800x700+80+80')

        self.top_title = Label(self.window, text='入库操作', bg='SkyBlue', font=('楷体', 20), width=70, height=2)
        self.top_title.pack()  # pack()确定控件在窗体的位置,以及控件可用

        self.var_id = StringVar()        # 仓库id
        self.var_name = StringVar()      # 产品
        self.var_gender = StringVar()    # 数量
        self.var_age = StringVar()       # 单价
        self.var_gid = StringVar()       # 金额
        self.var_method = StringVar()    # 所在仓库

        self.right_top_id_label = Label(text="ID:", font=('楷体', 15)).pack(pady=15)
        self.right_top_id_entry = Entry(textvariable=self.var_id, font=('楷体', 15)).pack()

        self.right_top_name_label = Label(text="产品", font=('楷体', 15)).pack(pady=15)
        self.right_top_name_entry = Entry(textvariable=self.var_name, font=('楷体', 15)).pack()

        self.right_top_gender_label = Label(text="数量", font=('楷体', 15)).pack(pady=15)
        self.right_top_gender_entry = Entry(textvariable=self.var_gender, font=('楷体', 15)).pack()

        self.right_top_gender_label = Label(text="单价", font=('楷体', 15)).pack(pady=15)
        self.right_top_gender_entry = Entry(textvariable=self.var_age, font=('楷体', 15)).pack()

        self.right_top_gender_label = Label(text="金额", font=('楷体', 15)).pack(pady=15)
        self.right_top_gender_entry = Entry(textvariable=self.var_gid, font=('楷体', 15)).pack()

        self.right_top_method_label = Label(text="所在仓库", font=('楷体', 15)).pack(pady=15)
        self.right_top_method_entry = Entry(textvariable=self.var_method, font=('楷体', 15)).pack()

        self.right_top_button1 = ttk.Button(text='确定', width=20, command=self.new_row).pack(pady=30)
        self.right_top_button2 = ttk.Button(text='返回', width=20, command=self.back).pack()

        self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击



    def back(self):
        StartPage(self.window)  # 显示主窗口 销毁本窗口

    def new_row(self):
        if self.var_id.get() != '' and self.var_name.get() != '' and \
                self.var_gender.get() != '' and self.var_age.get() != '' and self.var_gid.get() != '' and self.var_method.get():
            db = pymysql.connect(host='localhost',user='root',port=3306,password='zx045498',db='project')
            cursor = db.cursor()  # 使用cursor()方法获取操作游标
            if self.var_method.get()=="warehouse_a":
                sql = "INSERT INTO warehouse_a(id,product,amount,price,money)  VALUES ('%s','%s','%s','%s','%s')" % \
                      (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_gid.get())
            else:
                sql="INSERT INTO warehouse_b(id,product,amount,price,money)   VALUES ('%s','%s','%s','%s','%s')" % \
                      (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_gid.get())

            try:
                cursor.execute(sql)  # 执行sql语句
                db.commit()  # 提交到数据库执行
                messagebox.showinfo('成功!')
            except:
                db.rollback()  # 发生错误时回滚
                messagebox.showinfo('警告!', '数据库连接失败!')
            db.close()  # 关闭数据库连接
        else:
            messagebox.showinfo('请输入数据!')


# 仓库查询
class Warehousing_enquire:
    def __init__(self, parent_window):
        parent_window.update()
        parent_window.destroy()  # 销毁子界面
        self.window = tk.Tk()
        self.window.title('仓库清单')
        self.window.geometry('800x800+150+150')
        db = pymysql.connect(host='localhost', user='root', port=3306, password='zx045498', db='project')
        cursor = db.cursor()  # 使用cursor()方法获取操作游标
        sql = "SELECT * FROM allgoods"  # SQL 语句
        try:
            cursor.execute(sql)  # 执行sql语句
            results = cursor.fetchall()
            for row in results:
                self.name = 'ID:' + row[0]
                self.id = '产品:' + row[1]
                self.gender = '数量:' + row[2]
                self.age='单价:'+row[3]
                self.gid = '金额:' + row[4]
                self.warehouse = '所在仓库:' + row[5]


                db.commit()  # 提交到数据库执行

                Label(self.window, text=self.name+" "+self.id+" "+self.gender+" "+self.age+" "+
                                        self.gid+" "+self.warehouse, font=('楷体', 18)).pack(pady=5)

        except:
            db.rollback()  # 发生错误时回滚
            messagebox.showinfo('警告!', '数据库连接失败!')
        db.close()  # 关闭数据库连接

        self.right_top_button4 = ttk.Button(text='返回', width=20, command=self.back).pack()
        self.window.protocol("WM_DELETE_WINDOW", self.back)

    def back(self):
        StartPage(self.window)


# 出库
class chuku:
    def __init__(self, parent_window):
        parent_window.update()
        parent_window.destroy()  # 销毁子界面

        self.window = tk.Tk()
        self.window.title('出库表')
        self.window.geometry('800x700+80+80')

        self.top_title = Label(self.window, text='出库', bg='SkyBlue', font=('楷体', 20), width=70, height=2)
        self.top_title.pack()

        self.var_id = StringVar()    # 仓库A/B
        self.var_name = StringVar()  # 货号
        self.var_gender = StringVar() # 数量
        self.var_age = StringVar()  # 单价
        self.var_gid = StringVar() # 金额
        self.var_method = StringVar()  # 所在仓库

        self.right_top_id_label = Label(text="ID", font=('楷体', 15)).pack(pady=15)
        self.right_top_id_entry = Entry(textvariable=self.var_id, font=('楷体', 15)).pack()

        self.right_top_name_label = Label(text="产品", font=('楷体', 15)).pack(pady=15)
        self.right_top_name_entry = Entry(textvariable=self.var_name, font=('楷体', 15)).pack()

        self.right_top_gender_label = Label(text="数量", font=('楷体', 15)).pack(pady=15)
        self.right_top_gender_entry = Entry(textvariable=self.var_gender, font=('楷体', 15)).pack()

        self.right_top_gender_label = Label(text="单价", font=('楷体', 15)).pack(pady=15)
        self.right_top_gender_entry = Entry(textvariable=self.var_age, font=('楷体', 15)).pack()

        self.right_top_gender_label = Label(text="金额", font=('楷体', 15)).pack(pady=15)
        self.right_top_gender_entry = Entry(textvariable=self.var_gid, font=('楷体', 15)).pack()

        self.right_top_method_label = Label(text="所在仓库", font=('楷体', 15)).pack(pady=15)
        self.right_top_method_entry = Entry(textvariable=self.var_method, font=('楷体', 15)).pack()

        self.right_top_button1 = ttk.Button(text='确定', width=20, command=self.new_row).pack(pady=30)
        self.right_top_button2 = ttk.Button(text='返回', width=20, command=self.back).pack()

        self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击

        self.id = []
        self.name = []
        self.gender = []
        self.age = []
        self.gid = []
        self.method = []

        # 打开数据库连接
        db = pymysql.connect(host='localhost', user='root', port=3306, password='zx045498', db='project')
        cursor = db.cursor()  # 使用cursor()方法获取操作游标
        sql = "SELECT * FROM allgoods"  # SQL 查询语句
        try:
            # 执行SQL语句
            cursor.execute(sql)
            # 获取所有记录列表
            results = cursor.fetchall()
            for row in results:
                self.id.append(row[0])
                self.name.append(row[1])
                self.gender.append(row[2])
                self.age.append(row[3])
                self.gid.append(row[4])
                self.method.append(row[5])
        except:
            print("Error: unable to fetch data")
            messagebox.showinfo('提示', '数据库连接失败!')
        db.close()  # 关闭数据库连接

    def back(self):
        StartPage(self.window)  # 显示主窗口 销毁本窗口

    def new_row(self):
        if self.var_id.get() != '' and self.var_name.get() != '':
            db = pymysql.connect(host='localhost', user='root', port=3306, password='zx045498', db='project')
            cursor = db.cursor()  # 使用cursor()方法获取操作游标
            sql = "DELETE FROM allgoods WHERE id='%s'" %(self.var_id.get())  # SQL 插入语句

            try:
                cursor.execute(sql)  # 执行sql语句
                db.commit()  # 提交到数据库执行
                messagebox.showinfo('提示!', '出库成功!')
            except:
                db.rollback()  # 发生错误时回滚
                messagebox.showinfo('警告!', '数据库连接失败!')
            db.close()  # 关闭数据库连接
        else:
            messagebox.showinfo('警告!', '填写出库信息')


if __name__ == '__main__':
    window = tk.Tk()
    StartPage(window)

  • 8
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Olivia的小跟班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值