Проблема с полосой прокрутки для текстового виджета - PullRequest
0 голосов
/ 10 октября 2018

Я просто пытаюсь создать полосу прокрутки для списка кнопок, которые появляются в моем текстовом виджете.Пока полоса прокрутки появляется в месте коррекции и правильного размера, но она неактивна и не позволяет мне прокручивать.Кто-нибудь знает, в чем может быть проблема?

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 голосов
/ 10 октября 2018

В вашем коде есть пара неправильных вещей.

Первое, что я хотел бы изменить, это перестать пытаться динамически генерировать имена переменных.Это практически никогда не является хорошей идеей и служит только для того, чтобы сделать ваш код чрезвычайно сложным для понимания и отладки.

Вместо этого сохраните кнопки и переменные в списке или словаре.Не требуется, чтобы каждая кнопка или переменная имела отдельную переменную, связанную с ней.

Например, следующий код иллюстрирует, как создать набор кнопок и переменных в цикле:

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. Вы, конечно, можете использовать в качестве индекса все, что захотите.

Во-вторых, текстовый виджет не может прокручивать объекты, добавленные в виджет, с помощью pack, place или grid.Виджет может прокручивать только элементы, добавленные в качестве содержимого в виджет.Чтобы добавить флажок, вы можете использовать метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...