tkinter尤克里里爬格子练习器

2022年学了乌克丽丽,写了一个爬格子练习器,年底了,改进了一下,先给大家看看界面,中间的4个数字代表品格,会按照一定时间自动切换前4个品格,方便爬格子练习,品格的切换速度也可以自由调节!

使用了控件的有:Button、Label、OptionMenu,布局则是pack、place的混合使用,整个程序大约80行,如果你正在练习乌克丽丽、也在学习tkinter,这个程序不要错过哦,还有after方法的使用,以及DoubleVar的使用(涉及到双向绑定)、Frame的区域组合等等,欢迎交流!

开源

import tkinter
import random


class MainWindow(tkinter.Tk):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.title("王员外爬格子练习器_v1.0")
        self.wm_geometry('800x600')
        self.last_index = 0
        self.str_var_list = []
        self.cancel_after_id = None
        self.current_status = "new"
        self.change_interval_var = tkinter.DoubleVar(value=3)
        self.source_list = ['1234', '1243', '1324', '1342', '1423', '1432', '2134', '2143', '2314', '2341', '2413',
                            '2431', '3124', '3142', '3214', '3241', '3412', '3421', '4123', '4132', '4213', '4312', '4321']
        default_number = self.source_list[0]
        self.number_box = tkinter.Frame(self)
        self.number_box.place(in_=self, relx=0.5,
                              rely=0.5, anchor=tkinter.CENTER)
        for num in default_number:
            self.str_var_list.append(self.create_label(self.number_box, num))
        self.init_top_zone()
        self.init_start_btn()

    def init_top_zone(self):
        my_top_zone = tkinter.Frame(self)
        my_top_zone.pack(side=tkinter.TOP, anchor=tkinter.W,
                         pady=2, fill=tkinter.X)
        tips = tkinter.Label(
            my_top_zone, text="每个数字代表品格,欢迎挑战您的手速", font=('微软雅黑', 12), fg="red")
        tips.pack(side=tkinter.LEFT, anchor=tkinter.W)
        interval_zone = tkinter.Frame(my_top_zone)
        interval_zone.pack(side=tkinter.RIGHT, anchor=tkinter.E)
        choice_label = tkinter.Label(interval_zone, text="品格切换速度(秒):")
        choice_label.pack(side=tkinter.LEFT)
        chice_interval = tkinter.OptionMenu(
            interval_zone, self.change_interval_var, "0.3", "0.5", "1", "2", "3", "4", "5", "6")
        chice_interval.pack(side=tkinter.LEFT, anchor=tkinter.E)

    def init_start_btn(self):
        def run_start():
            if self.current_status == "new":
                self.change_number()
                start_btn["text"] = "停止"
                self.current_status = "running"
            else:
                self.after_cancel(self.cancel_after_id)
                self.current_status = "new"
                start_btn['text'] = "开始"
        start_btn = tkinter.Button(self, text="开始", font=(
            '微软雅黑', 35), fg='red', command=run_start)
        start_btn.pack(side=tkinter.BOTTOM, fill=tkinter.X)

    def change_number(self):
        index = random.randint(0, len(self.source_list) - 1)
        if self.last_index == index:
            index = index + 1
            if index == len(self.source_list):
                index = 0
        self.last_index = index
        result = self.source_list[index]
        for index, var in enumerate(self.str_var_list):
            var.set(result[index])
        safe_mill = int(self.change_interval_var.get() * 1000)
        self.cancel_after_id = self.after(
            safe_mill, func=self.change_number)

    def create_label(self, master, text) -> tkinter.Label:
        str_var = tkinter.StringVar(value=text)
        my_label = tkinter.Label(
            master, textvariable=str_var, font=('微软雅黑', 220), padx=10)
        my_label.pack(side=tkinter.LEFT)
        return str_var


if __name__ == "__main__":
    root_window = MainWindow()
    root_window.mainloop()

总结

学习tkinter多了, 有些程序很喜欢用tkinter去写,简洁好玩!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值