python-GUI编程

"""尚学堂学习笔记,复习用"""

 通过面向对象的写法编写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()  # 不断进行事件循环


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值