如何禁用TKinter滚动条小部件?

时间:2019-08-14 17:59:10

标签: python tkinter

我正在用GUI编写一个单线程程序,该程序执行一系列任务。在执行这些任务期间,会定期刷新GUI以检查一些可用输入(例如中止)。为避免因不必要的输入而中止任务,在执行过程中,所有.config(state='disabled')会禁用所有不必要的GUI元素。 但是,由于某些原因,滚动条是唯一的,并且没有"-state"选项。

2 个答案:

答案 0 :(得分:0)

我认为您无法使用-state选项禁用滚动条小部件,我已经在Tcl/Tk网站上进行了搜索,但没有找到任何相关信息。

但是我敢肯定,如果您使用的是pack_forget()几何图形,则可以使用pack方法将其从窗口中删除;如果您使用的是{{3},则可以是grid_forget() }几何图形,因此以后可以再次显示滚动条小部件,再次调用pack/grid

这是一个例子:

from tkinter import *

master = Tk()

scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)

def disable_scroll():
    scrollbar.pack_forget()

def active_scroll():
    scrollbar.pack(side=LEFT, fill=BOTH)
    scrollbar.config(command=None)

btn1 = Button(master, text="OK 1", command=disable_scroll)
btn1.pack()

btn2 = Button(master, text="OK 2", command=active_scroll)
btn2.pack()


listbox = Listbox(master, yscrollcommand=scrollbar.set)
for i in range(1000):
    listbox.insert(END, str(i))

listbox.pack(side=LEFT, fill=BOTH)
scrollbar.config(command=listbox.yview)

mainloop()

滚动条根据列表框的值而变化,所以正如我所说的那样,这是代码:

from tkinter import *
import random

master = Tk()

scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)

def disable_scroll():
    scrollbar.pack_forget()

def active_scroll():
    scrollbar.pack(side=LEFT, fill=BOTH)
    scrollbar.config(command=None)

btn1 = Button(master, text="disable_scroll", command=disable_scroll)
btn1.pack()

btn2 = Button(master, text="active_scroll", command=active_scroll)
btn2.pack()

listbox = Listbox(master, yscrollcommand=scrollbar.set)

#NEW FUNCTIONS
def count():
    listbox.delete(0, END)

    lista = [5, 8, 500, 1000]
    for i in range(random.choice(lista)):
        listbox.insert(END, str(i))

def delete():
    listbox.delete(0, END)

#NEW BUTTONS
btn3 = Button(master, text="start", command=count)
btn3.pack()

btn4 = Button(master, text="delete", command=delete)
btn4.pack()

listbox.pack(side=LEFT, fill=BOTH)
scrollbar.config(command=listbox.yview)

mainloop()

答案 1 :(得分:0)

使滚动条以禁用外观(而不是隐藏)显示的另一种可能方法是:

  1. 删除列表中的所有条目(滚动条将被禁用)
  2. 从列表中卸下滚动条
  3. 在断开滚动条的情况下重新插入已删除的条目(滚动条将保持禁用状态)

在下面的代码中,“ listbox”是我的tk.Listbox对象,“ scrollbar”是关联的“ tk.Scrollbar”对象,而self是对父对象的引用。在Windows上使用Python 3.8.4rc1测试了代码。

禁用代码:

entries = listbox.get(0, "end")
listbox.delete(0, "end")
self.update()
listbox.config(yscrollcommand="")
scrollbar.config(command="")
listbox.insert("end", *entries)
listbox['state'] = "disabled"

启用代码:

listbox['state'] = "normal"
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)