"""尚学堂学习笔记,复习用"""
通过面向对象的写法编写GUI程序


组件的常见属性



操纵组件和组件属性编写简易的登录界面:
操作代码




运行结果:


变量绑定相关操作:

text文本框应用实例代码:





效果:

单选按钮:Radiobutton
#通过StringVar()对象实现变量绑定进而动态输出选择的信息 self.v = StringVar() 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())
讯享网
多选按钮:Checkbutton
讯享网 self.codeHobby = IntVar() self.videoHobby = IntVar() print(self.codeHobby.get) self.c1 = Checkbutton(self, text = "敲代码", Variable = self.codeHobby, onvalue = 1, offvalue = 0) self.c2 = Checkbutton(self, text = "看视频", Varialbe = self.videoHobby, onvalue = 1, offvalue = 0) self.c1.pack(side = "left") self.c2.pack(side = "left") Button(self, text = "确定", command = self.confirm).pack(self = "left") def confirm(self): if self.videoHobby.get() == 1: messagebox.showinfo("测试", "看视屏———") if self.codeHobby.get() == 1: messagebox.showinfo("测试", "程序猿————")
canvas组件:
def createWidget(self): self.canvas = Canvas(self, width = 300, height = 200, bg = "green") self.canvas.pack() line = self.canvas.create_line(10, 10, 30, 20, 40, 50) rect = self.canvas.create_rectangle(50, 50, 100, 100) oval = self.canvas.create_oval(50, 50, 100, 100) global photo photo = PhotoImage(file = "图片路径") self.canvas.create_image(150, 170, image = photo) Button(self, text = "画10个矩形", command = self.draw10Rec).pack(self = "left") def draw10Rec: 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_rectange(x1, y1, x2, y2)



通过girp布局登录界面:
讯享网def createWidget(self): self.label01 = Label(self, text = "用户名") self.label01.grid(row = 0, column = 0) self.entry01 = Entry(self) self.entry01.grid(row = 0, column = 1) Label(self, text = "用户名为手机号").grid(row = 0, column = 2) Label(self, text = "密码").grid(row = 1, column = 0) Entry(self, show = "*").grid(row = 1, column = 1) Button(self, text = "登录").grid(row = 2, column = 1, sticky = EW) BUtton(self, text = "取消").grid(row = 2, column = 2, sticky = E)

布局计算机界面:
def createWidget(self): btnText = (("MC", "M+", "M-", "MR"), ("C", "±", "/", "×") (7, 8, 9, "-"), (4, 5, 6, "+"), (1, 2, 3, "="), (0, ".")) Entry(self).gird(row = 0, column = 0, columnspan = 4, pady = 10) for rindex, r in enumerate(btnText): for cindex, c in enumerate(r): if c == "=": Button(self, text = c, width = 2)\ .grid(row = rindex + 1, column = cindex, rowspan = 2, sticky = NSEW) elif c == 0: Button(self, text = c, width = 2)\ .grid(row = rindex + 1, column = cindex, columnspan = 2, sticky = NSEW) elif c == ".": Button(self, text = c, width = 2)\ .grid(row = rindex + 1, column = cindex + 1, sticky = NSEW) else: Button(self, text = c, width = 2)\ .grid(row = rindex + 1, column = cindex, sticky = NSEW)

通过pack布局界面



pack实现钢琴界面布局
讯享网from tkinter import * root = Tk() root.geometry("700x220") f1 = Frame(root) f1.pack() f2 = Frame(root) f2.pack() btnText("流行风", "中国风", "古风", "重金属", "轻音乐") for txt in btnText: Button(f1, text= txt).pack(side = "left", padx = "10") for i in range(1, 13): Label(f2, width = 5, height = 10, borderwidth = 1, relief = "solid", bg = "black" if i % 2 == 0 else "white").pack(side = "left, padx = "2") root.mainloop()

通过place布局界面


案例
# coding=utf-8 from tkinter import * root = Tk(); root.geometry("500x300") root.title("布局管理place"); root["bg"] = "white" f1 = Frame(root, width = 200, height = 200, bg = "green") f1.place(x = 30, y = 30) #当relx和x同时存在时,x表示偏移量 Button(root, text = "江西理工大学").place(relx = 0.2, x = 100, y = 20, relwidth = 0.2, relheight = 0.5) Button(f1, text = "信息工程学院").place(relx = 0.6, rely = 0.7) Button(f1, text = "学生").place(relx = 0.5, rely = 0.2) root.mainloop()

事件机制

lambda表达式在组件command中进行传参


三种事件绑定

选择菜单(OptionMenu)

滑块(Scale)


颜色框


文件选择框



简单对话框

通用消息框



ttk子模块

用pyinstall可以将文件打包成可执行文件(.exe, 将文件和python解释器打包)

画图软件:
讯享网from tkinter import * from tkinter.colorchooser import * # 选择颜色的组件 class Application(Frame): # 继承自Frame组件,直接在Frame组件中增加子组件 def __init__(self, master=None): # 绑定根窗口 super().__init__(master) self.master = master self.pack() # 添加一些需要使用的属性 self.st_draw = False self.last_draw = 0 self.x = 0 self.y = 0 self.fg_color = "#ff0000" self.canvas_width = 900; self.canvas_height = 450; self.canvas_color = "#000000" # 调用创造子组件的方法 self.createWidget() def createWidget(self): self.my_canvas = Canvas(root, width=self.canvas_width, height=self.canvas_height*0.9, bg=self.canvas_color) self.my_canvas.pack() my_start = Button(root, text="开始", name="start") my_start.pack(side="left", padx=10) my_pen = Button(root, text="画笔", name="pen") my_pen.pack(side="left", padx=10) my_rect = Button(root, text="矩形", name="rect") my_rect.pack(side="left", padx=10) my_clear = Button(root, text="清屏", name="clear") my_clear.pack(side="left", padx=10) my_eraser = Button(root, text="橡皮擦", name="eraser") my_eraser.pack(side="left", padx=10) my_line = Button(root, text="直线", name="line") my_line.pack(side="left", padx=10) my_lineArrow = Button(root, text="箭头直线", name="lineArrow") my_lineArrow.pack(side="left", padx=10) my_color = Button(root, text="颜色", name="color") my_color.pack(side="left", padx=10) # 绑定事件 self.my_canvas.bind("<ButtonRelease-1>", self.stopDraw) my_pen.bind_class("Button", "<1>", self.eventManager) # 增加颜色切换的快捷键 root.bind("<KeyPress-r>", self.kuaijiejian) root.bind("<KeyPress-g>", self.kuaijiejian) root.bind("<KeyPress-b>", self.kuaijiejian) # 管理事件 def eventManager(self, event): name = event.widget.winfo_name() print(name) if name == "line": self.my_canvas.bind("<B1-Motion>", self.myline) elif name == "lineArrow": self.my_canvas.bind("<B1-Motion>", self.mylineArrow) elif name == "rect": self.my_canvas.bind("<B1-Motion>", self.my_rect) elif name == "pen": self.my_canvas.bind("<B1-Motion>", self.my_pen) elif name == "eraser": self.my_canvas.bind("<B1-Motion>", self.my_eraser) elif name == "clear": self.my_canvas.delete("all") elif name == "color": c = askcolor(color=self.fg_color, title="选择画笔颜色") self.fg_color = c[1] # 定义子组件功能 def stopDraw(self, event): self.st_draw = False self.last_draw = False def startDraw(self, event): self.my_canvas.delete(self.last_draw) if not self.st_draw: self.st_draw = True self.x = event.x self.y = event.y def myline(self, event): self.startDraw(event) self.last_draw = self.my_canvas.create_line(self.x, self.y, event.x, event.y, fill=self.fg_color) def mylineArrow(self, event): self.startDraw(event) self.last_draw = self.my_canvas.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fg_color) def my_rect(self, event): self.startDraw(event) self.last_draw = self.my_canvas.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fg_color) def my_pen(self, event): self.startDraw(event) self.my_canvas.create_line(self.x, self.y, event.x, event.y, fill=self.fg_color) self.x = event.x self.y = event.y def my_eraser(self, event): self.startDraw(event) self.my_canvas.create_rectangle(event.x-4,event.y-4,event.x+4,event.y+4,fill=self.canvas_color) def kuaijiejian(self, event): if event.char == 'r': self.fg_color = "#ff0000" elif event.char == 'g': self.fg_color = "#00ff00" elif event.char == 'b': self.fg_color = '#0000ff' if __name__ == "__main__": root = Tk() # 根窗口 root.title("画图软件") # 根窗口的标题 app = Application(master=root) # 创建app对象,app对象的父组件为root root.geometry(str(app.canvas_width) + 'x' + str(app.canvas_height) + "+400+200") # 跟窗口大小为画布大小,离左屏幕400,上屏幕200 root.mainloop() # 不断进行事件循环

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/55445.html