当前位置:   article > 正文

python-GUI图形界面之Tkinter(常用控件、事件对象、布局管理)_python tkiner构建布局

python tkiner构建布局

目录

代码演示

经典GUI面向编程

常见控件

控件对象属性设置方法

lable标签

输入控件Entry

Text多行文本框

单(复)选框

画布Canvas 

布局管理器

grid布局管理器

pack布局管理器

place布局管理器

事件对象

鼠标和键盘事件

event对象常用属性


Tkinter

tkinter (Tk interface)是Python的标准GUI库,支持跨平台的GUI程序开发。tkinter 适合小型的GUI程序编写,特别适合初学者学习GUI编程。

Python GUI 编程(Tkinter) | 菜鸟教程

Python Tkinter-Python 手册 - Python学习网

tkinter —— Tcl/Tk 的 Python 接口 — Python 3.10.1 文档

Python Qt图像界面编程_北冥有鱼的博客-CSDN博客

wxPython

wxPython是比较流行的GUI库,适合大型应用程序开发,功能强于tkinter,整体设计框架类似于MFC(Microsoft Foundation Classes微软基础类库)。

代码演示

  1. from tkinter import *
  2. from tkinter import messagebox
  3. root = Tk() # 创建窗口对象
  4. root.title('窗口1') # 定义窗口的标题
  5. root.geometry('500x300+300+200') # 定义窗口显示大小和显示位置
  6. but1 = Button(root) # 创建一个按钮对象
  7. but1['text'] = '点我☞'
  8. but1.pack()
  9. def click(event):
  10. name = '《节妇吟·寄东平李司空师道》'
  11. text = '''
  12. 《节妇吟·寄东平李司空师道》
  13. ——唐·张籍
  14. 君知妾有夫,赠妾双明珠。
  15. 感君缠绵意,系在红罗襦。
  16. 妾家高楼连苑起,良人执戟明光里。
  17. 知君用心如日月,事夫誓拟同生死。
  18. 还君明珠双泪垂,恨不相逢未嫁时。
  19. '''
  20. messagebox.showinfo(name, text) # 参数:弹窗标题,内容
  21. but1.bind('<1>', click)
  22. root.mainloop() # 调用mainloop()组件,进行事件循环

主窗口位置和大小:通过geometry('wx±x±y')进行设置。w为宽度, h为高度。+x表示距屏幕左边的距离; -x 表示距屏幕右边的距离; +y表示距屏幕上边的距离;-y表示距屏幕下边的距离。

经典GUI面向编程

  1. # tk.py
  2. from tkinter import *
  3. from tkinter import messagebox
  4. from tk import shici
  5. class App(Frame):
  6. def __init__(self, master=None):
  7. super().__init__(master)
  8. self.master = master
  9. self.pack()
  10. self.createWidget()
  11. def createWidget(self):
  12. '''
  13. 创建组件
  14. :return:
  15. '''
  16. # 创建一个按钮组件
  17. but1 = Button(self)
  18. but1['text'] = '点我☞'
  19. but1['command'] = self.shici
  20. but1.pack()
  21. def shici(self):
  22. text = shici.shici['《节妇吟·寄东平李司空师道》']
  23. messagebox.showinfo('《节妇吟·寄东平李司空师道》', '《节妇吟·寄东平李司空师道》\n' + text)
  24. if __name__ == '__main__':
  25. root = Tk()
  26. root.title('demo')
  27. root.geometry('500x300+300+200')
  28. t = App(master=root)
  29. root.mainloop()
  30. t.createWidget()
  31. # shici.py
  32. shici = {
  33. '《节妇吟·寄东平李司空师道》':'\t\t\t——唐·张籍\n君知妾有夫,赠妾双明珠。\n感君缠绵意,系在红罗襦。\n妾家高楼连苑起,良人执戟明光里。'
  34. '\n知君用心如日月,事夫誓拟同生死。\n还君明珠双泪垂,恨不相逢未嫁时。'
  35. }

常见控件

控件对象属性设置方法

设置组件属性控制组件的各种状态,如:宽度、高度、颜色、位置等。设置的三种方法:

1.创建对象时,使用关键字参数:fd = Button(self, fg="red", bg= "blue")

2.创建对象后,使用字典索引方式:fd["fg"] = "red"  ; fd["bg"] = "blue"

3.创建对象后,使用config0方法:fd.config(fg="red", bg= "blue")

lable标签

标签属性

1. width,height:用于指定区域大小,如果显示是文本,则以单个英文字符大小为单位(一个汉字占2个字符位置);如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。

2.font:指定字体和字体大小,如:font=(font_name,size)

3. image:显示在Label上的图像,目前tkinter只支持gif格式。

4.fg和bg:fg (foreground) :前景色、bg (background) :背景色

5. justify:针对多行文字的对齐,可设置justify属性,可选值"left"、"center" or "riaht"

6.text:文本内容

7.padx 、pady:水平、垂直边距

8.compound:同一个区域显示文字和图片混合

  1. from tkinter import *
  2. class App(Frame):
  3. def __init__(self, master=None):
  4. super().__init__(master)
  5. self.master = master
  6. self.pack()
  7. self.createWidget()
  8. def createWidget(self):
  9. # 1、创建一个退出按钮
  10. butQuit = Button(self, text='退 出', command=root.destroy)
  11. butQuit.pack(side='left')
  12. # 2、创建Lable组件
  13. Label(self, text='学习使我快乐\n不死不休\n不眠不止', width=50,
  14. height=8, bg='red', fg='blue', font=('华文新魏', 12)).pack()
  15. # 3、图片显示
  16. global photo # 将photo声明成全局变量。如果是局部变量,本方法执行完毕后,图像对象销毁,窗口显示不出图像
  17. photo = PhotoImage(file='./img/logo.png')
  18. lable_img = Label(image=photo)
  19. lable_img.pack()
  20. if __name__ == '__main__':
  21. root = Tk()
  22. root.title('demo')
  23. root.geometry('500x300+300+200')
  24. t = App(master=root)
  25. root.mainloop()
  26. t.createWidget()

输入控件Entry

Entry用来接收一行字符串的控件。
如果用户输入的文字长度长于Entry控件的宽度时,文字会自动向后滚动。
如果想输入多行文本,需要使用Text 控件。

  1. from tkinter import *
  2. from tkinter import messagebox
  3. class App(Frame):
  4. def __init__(self, master=None):
  5. super().__init__(master)
  6. self.master = master
  7. self.pack()
  8. self.createWidget()
  9. def createWidget(self):
  10. Label(self, text='用户名', font=('华文新魏', 15)).pack()
  11. password = Label(self, text='密 码', font=('华文新魏', 15))
  12. '''
  13. StringVar变量绑定到指定的组件
  14. StringVar变量的值发生变化,组件内容也变化;
  15. 组件内容发生变化,StringVar变量的值也发生变化
  16. '''
  17. v1 = StringVar()
  18. self.um = Entry(self, textvariable=v1)
  19. self.um.pack()
  20. password.pack()
  21. v2 = StringVar()
  22. self.pd = Entry(self, textvariable=v2, show='·')
  23. self.pd.pack()
  24. Button(self, text='登 录', bg='#33ccff', command=self.login).pack()
  25. def login(self):
  26. username = self.um.get()
  27. password = self.pd.get()
  28. if username == 'jbb' and password == '123456':
  29. messagebox.showinfo('欢迎登录', '恭喜你登录成功!')
  30. else:
  31. messagebox.showinfo('欢迎登录', '对不起,您输入的用户名或密码错误,请重新登陆')
  32. if __name__ == '__main__':
  33. root = Tk()
  34. root.title('demo')
  35. root.geometry('500x800+300+200')
  36. t = App(master=root)
  37. root.mainloop()
  38. t.createWidget()

Text多行文本框

Text(多行文本框)主要用于显示多行文本,还可以显示网页链接,图片, HTML页面,甚至CSS样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。比如IDLE就是Text组件构成的。

  1. ''' 经典GUI程序——面向对象编程 '''
  2. from tkinter import *
  3. import webbrowser
  4. class App(Frame):
  5. def __init__(self, master=None):
  6. super().__init__(master)
  7. self.master = master
  8. self.pack()
  9. self.createWidget()
  10. def createWidget(self):
  11. # 多行文本框
  12. '''
  13. indexes (索引)是用来指向Text组件中文本的位置,Text的组件索引也是对应实际字符之间的位置。行号以1开始,列号以0开始
  14. '''
  15. self.w1 = Text(self, width=50, height=12, bg='#ccccb3')
  16. self.w1.pack()
  17. self.w1.insert(1.0, '名句:\n')
  18. self.w1.insert(2.2, '好风凭借力,\n送我上青云')
  19. Button(self, text='插入内容', command=self.insertText).pack(side='left')
  20. Button(self, text='获取内容', command=self.returnText).pack(side='left')
  21. Button(self, text='插入图片', command=self.addImg).pack(side='left')
  22. Button(self, text='新增控件', command=self.addWidget).pack(side='left')
  23. Button(self, text='搜 索', command=self.testText).pack(side='left')
  24. def insertText(self):
  25. self.w1.insert(INSERT, '\n\t\t薛宝钗') # INSERT表示在光标处插入内容
  26. self.w1.insert(END, '\n\t\t——《红楼梦》词句') # END表示在末尾插入
  27. def returnText(self):
  28. print(self.w1.get(1.0, END)) # 参数:获取文本内容的位置(起始坐标)
  29. def addImg(self):
  30. global photo
  31. photo = PhotoImage(file='img/logo.png')
  32. self.w1.image_create(END, image=photo)
  33. def addWidget(self):
  34. bt = Button(self.w1, text='newWidget')
  35. self.w1.window_create(END, window=bt)
  36. def testText(self):
  37. self.w1.delete(1.0, END)
  38. self.w1.insert(INSERT, '12345\nabcde\n百度一下\n呵呵呵!')
  39. self.w1.tag_add('百度一下', 3.0, 3.4)
  40. self.w1.tag_config('百度一下', background='yellow', foreground='red', underline=True, font=('华文新魏', 15))
  41. self.w1.tag_bind('百度一下', '<1>', self.webshow)
  42. def webshow(self, event):
  43. webbrowser.open('http://www.baidu.com')
  44. if __name__ == '__main__':
  45. root = Tk()
  46. root.title('demo')
  47. root.geometry('500x300+300+200')
  48. t = App(master=root)
  49. root.mainloop()
  50. t.createWidget()

单(复)选框

单选框

  1. def createWidget(self):
  2. # 单选框
  3. Label(self, text='性别:').pack(side='left')
  4. self.v = StringVar()
  5. self.v.set('1') # 设置默认选择值
  6. self.r1 = Radiobutton(self, text='男', value='1', variable=self.v).pack(side='left')
  7. self.r2 = Radiobutton(self, text='女', value='0', variable=self.v).pack(side='left')
  8. Button(self, text='确定', command=self.confirm).pack(side='left')
  9. def confirm(self):
  10. xb = '男' if self.v.get() == '1' else '女'
  11. messagebox.showinfo('性别选择结果', '你选择的性别是:%s' % xb)

  

复选框

  1. def createWidget(self):
  2. # 复选框
  3. Label(self, text='爱好:').pack(side='left')
  4. self.hobby1 = IntVar()
  5. self.hobby2 = IntVar()
  6. self.c1 = Checkbutton(self, text='旅游', variable=self.hobby1, onvalue=1, offvalue=0).pack(side='left')
  7. self.c1 = Checkbutton(self, text='读书', variable=self.hobby2, onvalue=1, offvalue=0).pack(side='left')
  8. Button(self, text='确定', command=self.cof).pack(side='left')
  9. def cof(self):
  10. ah1, ah2 = self.hobby1.get(), self.hobby2.get()
  11. if ah1 == 1:
  12. messagebox.showinfo('爱好', '说走就走\n\n快乐尽在脚下')
  13. elif ah2 == 1:
  14. messagebox.showinfo('爱好', '皓首穷经\n\n学不可须臾而离也')
  15. else:
  16. messagebox.showinfo('你的爱好是啥?', '呜呼哀哉!\n\n一个没有灵魂的人生')

画布Canvas 

  1. def createWidget(self):
  2. self.canvas = Canvas(self,width = 500,height = 200,bg = 'yellow')
  3. self.canvas.pack()
  4. self.canvas.create_line(10,10,30,30,50,100) # 画直线,每两组为一个点,形成点和点的连接形成线
  5. self.canvas.create_rectangle(40,60,90,90) # 画矩形
  6. self.canvas.create_oval(50,50,150,150) # 画(椭)圆
  7. global photo
  8. photo = PhotoImage(file='img/logo.png')
  9. self.canvas.create_image(200,200,image = photo) # 添加图片

  

布局管理器

一个GUI应用程序必然有大量的组件,tkinter提供的布局管理器可组织、管理在父组件中子组件的布局方式。tkinter 提供了三种管理器: pack、 grid、 place。

grid布局管理器

grid表格布局,采用表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。

pack布局管理器

pack按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。pack是代码量最少,最简单的一种,可以用于快速生成界面。

place布局管理器

place布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景。

事件对象

一个GUI应用整个生命周期都处在一个消息循环(event loop)中。它等待事件的发生,并作出相应的处理。

Tkinter提供了用以处理相关事件的机制。处理函数可被绑定给各个控件的各种事件。

widget.bind(event, handler)

如果相关事件发生,handler函数会被触发,事件对象event会传递给handler 函数。

鼠标和键盘事件

event对象常用属性

  1. from tkinter import *
  2. root = Tk()
  3. root.title()
  4. root.geometry()
  5. c = Canvas(root, width=100, height=200, bg='yellow')
  6. c.pack()
  7. def eve(event):
  8. print(event.x, event.y)
  9. c.bind('<1>', eve)
  10. root.mainloop()

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/124833
推荐阅读
相关标签
  

闽ICP备14008679号