滚动条文本小部件出现问题

时间:2018-10-10 14:44:25

标签: python text tkinter widget

我只是想为显示在我的文本小部件上的复选按钮列表创建一个滚动条。到目前为止,滚动条显示在更正位置和正确的大小中,但显示为灰色,并且不允许我滚动。有谁知道可能是什么问题?

import tkinter
from tkinter import *

master = tkinter.Tk()
master.geometry("750x500")

checkbox_frame = Frame(master, borderwidth=1, highlightthickness=1,
                                 highlightbackground="black", highlightcolor="black")
checkbox_frame.pack(expand=False,ipadx=100,ipady=100)

text = Text(checkbox_frame, cursor="arrow")

vsb = Scrollbar(text, orient = tkinter.VERTICAL)
vsb.config(command=text.yview)

text.config(yscrollcommand=vsb.set)

text.configure(state="disabled")

vsb.pack(side=RIGHT, fill=Y)
text.pack(side="left", fill="both", expand=True)

listbox = Listbox(master)
listbox.place(x=3,y=0)
enable = []
for x_number_of_items in range(15):
    enable.append("Robot Test File "+ str(x_number_of_items))
list_for_listbox = ["one", "two", "three", "four"]

for item in list_for_listbox:
    listbox.insert(END, item)
    for y in enable:
        globals()["var{}{}".format(item, y)] = BooleanVar()
        globals()["checkbox{}{}".format(item, y)] = Checkbutton(text, text=y, variable=globals()["var{}{}".format(item, y)])

def onselect(evt):
    # Note here that Tkinter passes an event object to onselect()
    w = evt.widget
    x=0
    index = int(w.curselection()[0])
    value = w.get(index)
    print ('You selected item %d: "%s"' % (index, value))

    for y in enable:
        for item in list_for_listbox:
            globals()["checkbox{}{}".format(item, y)].place_forget()
        globals()["checkbox{}{}".format(value, y)].place(x=0,y=0+x)
        x+=50

listbox.bind('<<ListboxSelect>>', onselect)

def printcommand():
    for item in list_for_listbox:
        for y in enable:
            print(item + " [" + y + "] " + str(globals()["var{}{}".format(item, y)].get()))

print(enable)

printbutton = Button(master,text="Print",command= printcommand)
printbutton.place(x=100, y=250)

mainloop()

1 个答案:

答案 0 :(得分:1)

您的代码有几处错误。

我要更改的第一件事是停止尝试动态生成变量名。实际上,这绝不是一个好主意,只会使您的代码极难理解和调试。

相反,将复选按钮和变量存储在列表或词典中。不需要每个复选框或变量都具有与之关联的不同变量。

例如,以下代码说明了如何在循环中创建一堆检查按钮和变量:

for i in range(15):
    label = "Robot Test File {}".format(i)
    var = tk.BooleanVar()
    checkbutton = tk.Checkbutton(text, text=label, variable=var)
    cb_vars.append(var)
    checkbuttons.append(checkbutton)

有了它,您现在可以像使用任何列表一样引用复选按钮及其变量:cb_vars[0].get()等。如果您希望能够按名称引用它们,则可以使用字典而不是列表:

cb_vars = {}
checkbuttons = []
for i in range(15):
    label = "Robot Test File {}".format(i)
    var = tk.BooleanVar()
    checkbutton = tk.Checkbutton(text, text=label, variable=var)
    cb_vars[label] = var
    checkbuttons.append(checkbutton)

    text.window_create("insert", window=checkbutton)
    text.insert("end", "\n")

使用上述方法,您可以进行cb_vars['Robot Test File 1'].get()来获取复选按钮编号1的值。您当然可以使用任何您想用作索引的值。

第二,文本窗口小部件无法滚动使用packplacegrid添加到窗口小部件的内容。小部件只能滚动作为内容添加到小部件的内容。要添加复选按钮,您可以使用window_create方法。假设您希望每个复选框位于单独的行中,则需要在每个复选框之后添加一个换行符。

例如,以下是在可滚动文本小部件中创建15个复选框的方法:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, height=5)
vsb = tk.Scrollbar(root, orient="vertical", command=text.yview)
text.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)

cb_vars = []
checkbuttons = []
for i in range(15):
    label = "Robot Test File {}".format(i)
    var = tk.BooleanVar()
    checkbutton = tk.Checkbutton(text, text=label, variable=var)
    var.set(False)

    text.window_create("insert", window=checkbutton)
    text.insert("end", "\n")
    cb_vars.append(var)
    checkbuttons.append(checkbutton)

root.mainloop()