本文继上篇文章http://t.csdnimg.cn/rrsIL继续介绍GUI的图形界面编程(相关视频是哔站上的应该搜这个题目就能找到),文章还是很基础的,目前博主处于有一点基础的状态。
文章的主要介绍了依旧非常重要的结构tinkter库、重要组件简介(这个不用死记硬背 用的时候再说)、Text(多行文本框)、Radiobutton、Checkbutton、Canvas画布,依旧是很多代码部分是重复的,因为框架是固定的,跟着敲两遍就记住了,还是要动手。
感谢大佬持续支持!!既然路过就是缘分,点个赞吧!!!
目录
9.Text多行文本框详解_复杂tag标记
Text的主要用于显示多行文本,(不仅可以显示还可以编辑)还可以显示网页链接,图片,HTML页面,甚至CSS样式表,添加组件等。因此,也被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。比如IDLE就是Text组件构成的。
# P9
from tkinter import *
import webbrowser
# Frame 是一个组件
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
self.w1 = Text(root,width=40,height=12,bg="gray")
# 宽度20个字母(10个汉字),高度一个行高
self.w1.pack()
self.w1.insert(1.0,"0123456789\nabcdefg")
self.w1.insert(2.3,"锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦")
Button(self,text="重复输入文本",command=self.insertText).pack(side="left")
Button(self, text="返回文本", command=self.returnText).pack(side="left")
Button(self, text="添加图片", command=self.addImage).pack(side="left")
Button(self, text="添加组件", command=self.addWidget).pack(side="left")
Button(self, text="通过tag精确控制文本", command=self.testTag).pack(side="left")
def insertText(self):
# INSERT索引表示在光标处插入
self.w1.insert(INSERT,'ZMR')
self.w1.insert(END,'[love]')
def returnText(self):
# Indexes(索引)是用来指向Text组件中文本的位置,Text的组件索引也是对应实际字符之间的位置。
# 核心:行号以1开始,列号以0开始
# self.w1.index(Indexes)
self.w1.get(1.2,1.6)
self.w1.insert(1.8,'wuuwwuuwu')
print(f"所有文本内容:{self.w1.get(1.0,END)}")
def addImage(self):
# global photo
self.photo = PhotoImage(file="img/01.gif")
self.w1.image_create(END,image=self.photo)
def addWidget(self):
b1 = Button(self.w1,text='zmr')
# 在text创建组件的命令
self.w1.window_create(INSERT,window=b1)
def testTag(self):
self.w1.delete(1.0,END)
self.w1.insert(INSERT,"hello python!")
self.w1.tag_add("hello",background='yellow',foreground='red')
self.w1.tag_add("baidu",2.0,2.5)
self.w1.tag_config("baidu",underline=True)
self.w1.tag_bind("baidu","<Button-1",self.webshow)
def webshow(self,event):
webbrowser.open("http://www.baidu.com")
if __name__ == '__main__':
# 创建根窗口对象
root = Tk()
root.geometry('500x300-100-200')
app = Application(master=root)
root.mainloop() # 事件循环
10.Radiobutton_Checkbutton详解
1. message简介
messagebox
在Python的Tkinter库中,指的是一个用于显示消息框的模块。这些消息框通常作为模态对话框出现,用于向用户显示信息、警告、错误或询问用户确认等。Tkinter的messagebox
模块提供了多种类型的消息框,包括但不限于以下几种:
-
1. **showinfo**:显示一个带有确定按钮的信息框,用于向用户展示一般性的信息。 2. **showwarning**:显示一个带有确定按钮的警告框,用于提醒用户注意某些可能的问题或风险。 3. **showerror**:显示一个带有确定按钮的错误框,用于向用户报告程序执行过程中遇到的错误。 4. **askquestion**:显示一个带有“是”和“否”按钮的询问框,用于询问用户对于某个问题的选择。 5. **askokcancel**:显示一个带有“确定”和“取消”按钮的确认框,用于请求用户确认某个操作。 6. **askyesno**:显示一个带有“是”和“否”按钮的确认框,类似于`askquestion`,但通常用于更简单的确认/取消场景。 7. **askretrycancel**:显示一个带有“重试”和“取消”按钮的框,用于在用户执行某个可能失败的操作时提供重试的机会。 使用`messagebox`模块时,首先需要从Tkinter库中导入它。然后,可以通过调用相应的函数并传入标题和消息内容来显示消息框。这些函数通常会返回一个值,表示用户的操作结果(如点击了哪个按钮)。 需要注意的是,`messagebox`模块中的函数可以直接调用,无需创建Tk()对象或主循环,因为它们内部会处理这些事务。然而,在实际应用中,通常会将`messagebox`的使用与Tkinter的其他组件(如按钮、文本框等)结合起来,通过触发某个事件(如按钮点击)来显示消息框。 此外,虽然`messagebox`模块提供了丰富的消息框类型,但在设计GUI应用程序时,应谨慎使用消息框,避免过度打扰用户或导致用户混淆。在可能的情况下,应考虑使用更友好的用户交互方式(如提示图标、工具提示等)来向用户传达信息。
2. Radiobutton代码表示
from tkinter import *
from tkinter import messagebox
# Frame是一个组件 容器
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.createWideget()
# 核心代码!!!!
def createWideget(self):
self.v = StringVar();
self.v.set('F') # 设置默认选中
self.r1 = Radiobutton(self,text='男性',value='M',variable=self.v)
self.r2 = Radiobutton(self,text='女性', value='F', variable=self.v)
self.r1.pack(side='left');self.r2.pack(side='left')
Button(self,text='确定',command=self.confirm).pack(side='left')
def confirm(self):
messagebox.showinfo('测试','选择的性别:'+self.v.get()) #弹出来的一个提示框
if __name__ == '__main__':
# 创建根窗口对象
root = Tk()
root.geometry('500x300-100-200')
app = Application(master=root)
root.mainloop() #事件循环
3. Checkbutton代码表示
# 10.2 Checkbutton
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.createWideget()
# 核心代码!!!
def createWideget(self):
# 生成两个不同的变量
self.codeHobby = IntVar()
self.videoHobby = IntVar()
print(self.codeHobby.get()) #默认值为0
self.c1 = Checkbutton(self,text='敲代码',variable=self.codeHobby,onvalue=1,offvalue=0)
self.c2 = Checkbutton(self,text='看视频',variable=self.videoHobby,onvalue=1,offvalue=0)
self.c1.pack(side='left')
self.c2.pack(side='left')
Button(self,text='确定',command=self.confirm).pack(side='left')
def confirm(self):
if self.videoHobby.get() == 1:
messagebox.showinfo('测试','你喜欢看什么类型的视频?')
if self.codeHobby.get() == 1:
messagebox.showinfo('测试','码农一枚,祝你成功!')
if __name__ == '__main__':
# 创建根窗口对象
root = Tk()
root.geometry('450x250-200+200')
app = Application(master=root)
root.mainloop() #事件循环
11.Canvas画布组件
canvas(画布)是一个矩形区域,可以放置图形、图像、组件等。
# P11
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import random
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.createWidgets()
def createWidgets(self):
self.canvas = tk.Canvas(self, width=300, height=200, bg='green')
self.canvas.pack()
# 画一条折线
self.canvas.create_line(10, 10, 30, 20, 40, 50)
# 画一个矩形
self.canvas.create_rectangle(50, 50, 100, 100)
# 画一个椭圆
self.canvas.create_oval(50, 50, 100, 100)
# 加载并调整图片大小
img = Image.open('img/02.gif')
img = img.resize((100, 100)) # 假设你想将图片缩小到100x75
self.photo = ImageTk.PhotoImage(img)
self.canvas.create_image(150,75, image=self.photo, anchor='sw') #sw相对于锚点左下角 center居中 nw左上角nswe
# 添加按钮
btn = tk.Button(self, text='画十个矩形', command=self.draw)
btn.pack(side='left', padx=10, pady=10)
def draw(self):
for i in range(10):
x1 = random.randrange(int(self.canvas['width']) // 2)
y1 = random.randrange(int(self.canvas['height']) // 2)
x2 = x1 + random.randrange(int(self.canvas['width']) // 2)
y2 = y1 + random.randrange(int(self.canvas['height']) // 2)
self.canvas.create_rectangle(x1, y1, x2, y2, outline='blue') # 添加边框颜色以便可见
if __name__ == '__main__':
root = tk.Tk()
root.geometry('500x500+200+200') # 注意这里我修正了加减号的使用
app = Application(master=root)
root.mainloop()
欢迎小伙伴们白嫖~~~