Python GUI编程(Tkinter)

xiaoxiao2021-02-28  45

Tkinter 编程

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。

注意:Python3.x 版本使用的库名为 tkinter,即首写字母 T 为小写。

#python 3.x import tkinter

实例:

#!/usr/bin/python # -*- coding: UTF-8 -*- import Tkinter top = Tkinter.Tk() # 进入消息循环 top.mainloop()

以上代码执行结果如下图:

 

 

Tkinter 组件

Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。这些控件通常被称为控件或者部件。

目前有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用于显示你应用程序的消息框。

介绍以下几个控件的用法 Label Frame Entry Text Button Listbox Scrollbar 说明每个控件最后要加上pack().否则控件是无法显示的 1.Label 说明:标签 用法:Label(根对象,【属性列表】) 属性: text 要显示的文本 bg 背景颜色 bd 外围3D边界的宽度 font 字体(颜色、大小) width 控件宽度 height 控件高度 实例:

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() # 初始化Tk() root.title("label-test") # 设置窗口标题 root.geometry("200x300") # 设置窗口大小 注意:是x 不是* root.resizable(width=True, height=False) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True l = Label(root, text="label", bg="pink", font=("Arial",12), width=8, height=3) l.pack(side=LEFT) # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM root.mainloop() # 进入消息循环

 

运行结果:

 

2.Frame 说明:在屏幕上创建一块矩形区域,多作为容器来布局窗体 用法:frame(根对象,【属性列表】) 实例:

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() # 初始化Tk() root.title("frame-test") # 设置窗口标题 root.geometry("300x200") # 设置窗口大小 注意:是x 不是* root.resizable(width=True, height=False) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True Label(root, text="frame", bg="red", font=("Arial",15)).pack() frm = Frame(root) #left frm_L = Frame(frm) Label(frm_L, text="左上", bg="pink", font=("Arial",12)).pack(side=TOP) Label(frm_L, text="左下", bg="green", font=("Arial",12)).pack(side=TOP) frm_L.pack(side=LEFT) #right frm_R = Frame(frm) Label(frm_R, text="右上", bg="yellow", font=("Arial",12)).pack(side=TOP) Label(frm_R, text="右下", bg="purple", font=("Arial",12)).pack(side=TOP) frm_R.pack(side=RIGHT) frm.pack() # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM root.mainloop() # 进入消息循环

运行结果:

3.Entry

说明:创建单行文本框 用法:创建 Entry(根对象,【属性列表】)   绑定变量 var=StringVar() e=Entry(根对象, textvariable = var)    获取文本框中的值 var.get()    设置文本框中的值 var.set(item1) 实例:

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() # 初始化Tk() root.title("entry-test") # 设置窗口标题 root.geometry("300x200") # 设置窗口大小 注意:是x 不是* root.resizable(width=True, height=False) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True var = Variable() e = Entry(root, textvariable=var) var.set("entry") # 设置文本框中的值 e.pack() # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM root.mainloop() # 进入消息循环

 

运行结果:

 

4.Text 说明:向该空间内输入文本 用法: t = Text(根对象) 插入:t.insert(mark,内容) 删除:t.delete(mark1,mark2) 其中,mark可以是行号,或者特殊标识,例如 INSERT:光标的插入点CURRENT:鼠标的当前位置所对应的字符位置 END:这个Textbuffer的最后一个字符 SEL_FIRST:选中文本域的第一个字符,如果没有选中区域则会引发异常 SEL_LAST:选中文本域的最后一个字符,如果没有选中区域则会引发异常 实例: 

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() # 初始化Tk() root.title("text-test") # 设置窗口标题 root.geometry("300x200") # 设置窗口大小 注意:是x 不是* root.resizable(width=True, height=False) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True t = Text(root) t.insert('1.0',"text1\n") # 插入 t.insert(END,"text2\n") # END:这个Textbuffer的最后一个字符 t.insert('1.0',"text3\n") #t.delete('1.0','2.0') # 删除 t.pack() # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM root.mainloop() # 进入消息循环

运行结果:

5.Button 说明:创建按钮 用法:Button(根对象,【属性列表】) 实例:

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() # 初始化Tk() root.title("button-test") # 设置窗口标题 root.geometry() # 设置窗口大小 注意:是x 不是* def printhello(): t.insert(END,"hello\n") t = Text() t.pack() # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM Button(root, text="press", command=printhello).pack() root.mainloop() # 进入消息循环

 

运行结果:

 

 6.Listbox 说明:列表控件,可以含有一个或者多个文本框,可单选也可多选 用法: 创建 lb = ListBox(根对象,【属性列表】) 绑定变量 var = StringVar() lb=ListBox(根对象,listvariable=var) 得到列表中的所有值 var.get() 设置列表中的所有值 var.set((item1,item2,......)) 添加:lb.insert(item) 删除:lb.delete(item,...) 绑定事件 lb.bind('<ButtonRelease-1>',函数) 获得所选中的选项 lb.get(lb.curselection()) 属性:selectmode可以为BROWSE MULTIPL SINGLE 实例:

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() root.title("listbox-test") root.geometry() def print_item(event): print lb.get(lb.curselection()) var = StringVar() lb = Listbox(root, listvariable = var) list_item = [1,2,3,4] for item in list_item: lb.insert(END,item) lb.delete(2,4) var.set(('a','b','c','d')) print var.get() lb.bind('<ButtonRelease-1>',print_item) lb.pack() root.mainloop()

 

运行结果:

 

 7.Scrollbar 说明:垂直滚动控件 用法:ListBox(根对象,【属性列表】 实例:

#-*- coding: UTF-8 -*- from Tkinter import * root = Tk() # 初始化Tk() root.title("scrl-test") # 设置窗口标题 root.geometry() # 设置窗口大小 注意:是x 不是* def print_item(event): print lb.get(lb.curselection()) var = StringVar() lb = Listbox(root, height=5, selectmode=BROWSE, listvariable = var) lb.bind('<ButtonRelease-1>',print_item) list_item = [1,2,3,4,5,6,7,8,9,0] for item in list_item: lb.insert(END,item) scrl = Scrollbar(root) scrl.pack(side=RIGHT,fill=Y) lb.configure(yscrollcommand=scrl.set) # 指定Listbox的yscrollbar的回调函数为Scrollbar的set,表示滚动条在窗口变化时实时更新 lb.pack(side=LEFT,fill=BOTH) scrl['command'] = lb.yview # 指定Scrollbar的command的回调函数是Listbar的yview root.mainloop()

运行结果:

 

一个ttk.ProgressBar的使用例子:

 

import tkinter as Tkinter from tkinter import ttk import time import threading class PopupProgressBar: def __init__(self, title): self.title = title self.root = None self.bar = None self.bar_lock = threading.Lock() self.thread = None self.thread_upd = None self.is_stop_thread_upd = False self.value = 0 self.text = "" self.labelText = None# Tkinter.StringVar() if not self.title: self.title = "PopupProgressBar" def start(self): print("start") self.thread = threading.Thread(target=PopupProgressBar._run_, args=(self,)) self.thread.start() def _run_(self): print("_run_\n") root = Tkinter.Tk() root.geometry('500x80+500+200') root.title(self.title) self.labelText = Tkinter.StringVar() self.labelText.set(self.text) ft = ttk.Frame() ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP) label1 = Tkinter.Label(ft, textvariable=self.labelText) label1.pack(fill=Tkinter.X, side=Tkinter.TOP) pb_hD = ttk.Progressbar(ft, orient='horizontal',length = 300, mode='determinate') pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP) self.root = root self.bar = pb_hD self.bar["maximum"] = 100 self.bar["value"] = 0 self.thread_upd = threading.Thread(target=PopupProgressBar._update_, args=(self,)) self.thread_upd.start() self.root.mainloop() print('_run_ end') def _update_(self): while not self.is_stop_thread_upd: self.update_data(self.value) self.labelText.set(self.text) time.sleep(0.1) self.root.destroy() print('_update_ end') def update_data(self, value): if not self.bar: return if self.bar_lock.acquire(): self.bar["value"] = value self.bar_lock.release() def stop(self): if self.thread_upd: self.is_stop_thread_upd = True self.thread.join() if __name__ == '__main__': bar = PopupProgressBar('Upload XXX') bar.start() for i in range(0, 5): bar.value = i*20 bar.text = "aaa/"+str(i) time.sleep(0.5) print('i='+str(i)) bar.stop()

 

 

 

转载请注明原文地址: https://www.6miu.com/read-2625648.html

最新回复(0)