Listbox 与 Scrollbar 联动设置

接着上一篇的博文(tkinter 居中处理),接下来,需要在新建的窗口加点内容。
先上今天的代码:

from tkinter import *

class Win_Program:
    def __init__(self):
        self.master = Tk()
        self.master.state("zoomed") # 窗口最大化
        self.master.title("demo")
        self.master.grid()
        self.databases = list()
        self.var = StringVar()
        for i in range(40):
            self.databases.append("database"+str(i))

    def get_db_configure(self):
        top = Toplevel(self.master)
        top.title("数据库配置")
        top.resizable(0,0)  # 大小不可变
        # 创建的Toplevel对象 在最上层
        top.attributes("-toolwindow", 1)
        top.wm_attributes("-topmost", 1)
        top.grid()
        sb = Scrollbar(top)
        sb.grid(row=0, rowspan=20, sticky=E+NS, padx=10, pady=5, column=1)
        lb = Listbox(top, listvariable=self.var, width=65, yscrollcommand=sb.set, selectmode=SINGLE, height=20)
        for i in range(len(self.databases)):
            lb.insert(0, self.databases[i])
        lb.grid(row=0, rowspan=20, column=0, padx=5, pady=5)
        # Listbox 滚动时,通过lb.yview方法 通知到 Scrollbar 组件
        sb.config(command=lb.yview)

        return top

    def widget_to_center(self, master, width, height):
        # 获取屏幕长/宽
        self.width = self.master.winfo_screenwidth()
        self.height = self.master.winfo_screenheight()
        x = self.width / 2 - width / 2
        y = self.height / 2 - height / 2
        master.geometry('%dx%d+%d+%d' % (width, height, x, y))
        master.grid()
        print(self.width, self.height, x, y)

if __name__ == "__main__":
    win_program = Win_Program()
    win_program.widget_to_center(win_program.get_db_configure(), 500, 400)
    mainloop()

数据库设置页面,当然是展示数据库的信息了,本着删繁就简的原则,数据库配置就不从文件读取了,以一个列表代替:

        self.databases = list()
        for i in range(40):
            self.databases.append("database"+str(i))

程序运行时,有且仅有一个数据库连接,所以这里需要可一个单选的选择数据库配置的组件。对于单选框,Listbox 与 Radiobutton 都是一个不错的选择。由于Radiobutton是选择按钮,而此处是一组列表选项,Listbox更加符合需求:

        lb = Listbox(top, listvariable=self.var, width=65, yscrollcommand=sb.set, selectmode=SINGLE, height=20)
        for i in range(len(self.databases)):
            lb.insert(0, self.databases[i])
        lb.grid(row=0, rowspan=20, column=0, padx=5, pady=5)

创建lb对象时,参数listvariable=self.var 是一个定义的变量在 init 函数中定义,在python语法中是不用去定义一个变量是什么类型,但是此处为什么要声明呢?原因就是tkinter 本质上并不是python写的。扯远了,这个参数很重要,若没有这个参数,你不能关联lb对象中的每一组内容,继而不能实现单选的操作。 Listbox中的入参height=20与其它组件的height表达的意思稍有不同,此处为该列表可以展示20行,默认是10行数据。selectmode=SINGLE设置选择模式为单选模式(该组建还支持 BROWSE,MULTIPLE,EXTENDED 这三种模式)。

下一步就是本期重点了,滚动条联动设置,首先在窗口右侧生成一个滚动条:

        sb = Scrollbar(top)
        sb.grid(row=0, rowspan=20, sticky=E+NS, padx=10, pady=5, column=1)

设置当右侧滚动条滚动时,左侧的数据库配置会跟着动。通过 Listbox 的入参进行设置::

yscrollcommand=sb.set

设置当滚动左侧数据库配置时,右侧滚动条也会跟着动:

        # Listbox 滚动时,通过lb.yview方法 通知到 Scrollbar 组件
        sb.config(command=lb.yview)

好了,大功告成, 联动设置看起来也不是很难。效果图:
滚动条联动

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值