Python 无法将滚动条添加到tkinter中的文本小部件(包含多个框架)

Python 无法将滚动条添加到tkinter中的文本小部件(包含多个框架),python,tkinter,scrollbar,tk,tkinter-canvas,Python,Tkinter,Scrollbar,Tk,Tkinter Canvas,我正在尝试为我的python脚本创建一个GUI。当我按下“get issuetypes”按钮时,我从一个函数(在代码中,我刚刚获取了一个示例字典)中获取了一个字典。 对于每个项目(比如p1),我为列表中的所有元素创建一个复选按钮。 我为每个项目创建一个框架,所有这些框架都在一个文本框中(因为框架不支持在tkinter中滚动) 当字典的大小非常大时,textbox只会缩放并超出窗口大小,滚动条不起作用 如何让滚动条工作? 这是上述应用程序的代码 from tkinter import * fro

我正在尝试为我的python脚本创建一个GUI。当我按下“get issuetypes”按钮时,我从一个函数(在代码中,我刚刚获取了一个示例字典)中获取了一个字典。
对于每个项目(比如p1),我为列表中的所有元素创建一个复选按钮。 我为每个项目创建一个框架,所有这些框架都在一个文本框中(因为框架不支持在tkinter中滚动)
当字典的大小非常大时,textbox只会缩放并超出窗口大小,滚动条不起作用
如何让滚动条工作?

这是上述应用程序的代码

from tkinter import *
from tkscrolledframe import ScrolledFrame
from tkinter import messagebox
import os

root=Tk()
selected_issuetypes={}
bool_dict_selected_issuetypes={}
dict_issuetypes={}
def get_issuetypes():
    for widget in frame.winfo_children():
        widget.destroy()
    global dict_issuetypes
    #dict_issuetypes = function()
    dict_issuetypes={
        "p1":["a","b","c","d"],
        "p2":["a","b","c"],
        "p3":["a","b"],
        "p4":["a","b","c","d"],
        "p5":["a","b","c"],
        "p6":["a","b"],
        "p7":["a","b","c","d"],
        "p8":["a","b","c"],
        "p9":["a","b"],
        "p10":["a","b","c","d"],
        "p11":["a","b","c"],
        "p12":["a","b"],
        "p13":"not valid"
    }
    for project,issuetypes in dict_issuetypes.items():
        if str(type(issuetypes))=="<class 'list'>":
            bool_dict_selected_issuetypes[project]=[BooleanVar() for i in range(len(issuetypes))]
            selected_issuetypes[project]=[]
    r=c=0
    fr=0
    color="white"
    for project,issuetypes in dict_issuetypes.items():
        frame1=Frame(frame,bg=color)
        frame1.grid(row=fr,columnspan=3,sticky='we')
        if str(type(issuetypes))=="<class 'list'>":
            Label(frame1,text=project,width=10,anchor='w',bg=color).grid(row=r,column=c)
            for i in range(0,len(issuetypes)):
                Checkbutton(frame1,text=issuetypes[i],variable=bool_dict_selected_issuetypes[project][i],bg=color).grid(row=r,column=c+1,sticky='w')
                r=r+1
        else:
            Label(frame1,text=issuetypes+'\n',bg=color).grid(row=r,column=c+1)
            r=r+1
        r=r+1
        fr=fr+1
        if color=="white":
            color="grey"
        else:
            color="white"


height = root.winfo_screenheight()
width = root.winfo_screenwidth()
root.geometry(str(width)+'x'+str(height-100)+'+'+'0'+'+'+'0')
project_label=Label(root,text="enter project keys/id's :-")
project_label.grid(row=0,column=0,padx=10,pady=10)
project_entry=Entry(root,width=100)
project_entry.insert(0,"enter here")
project_entry.grid(row=0,column=1,padx=10,pady=10)
get_issues_button=Button(root,text="get issuetypes",command=get_issuetypes)
get_issues_button.grid(row=0,column=2,padx=10,pady=10)
frame=Text(root)
frame.grid(row=1,columnspan=3,sticky='nsew',padx=2,pady=2)
frame.grid_columnconfigure(0, weight=1)
frame.grid_rowconfigure(0, weight=1)
v=Scrollbar(root,command=frame.yview)
v.grid(row=1, column=3, sticky='nsew')
frame['yscrollcommand']=v.set
frame.config(font=("consolas", 12), undo=True, wrap='word')

root.mainloop()
从tkinter导入*
从tkscrolledframe导入ScrolledFrame
从tkinter导入消息框
导入操作系统
root=Tk()
所选的_issueType={}
bool_dict_selected_issueType={}
dict_issuetypes={}
def get_issuetypes():
对于frame.winfo_children()中的小部件:
widget.destroy()
全球dict_发行类别
#dict_issueType=函数()
dict_issuetypes={
“p1”:[“a”、“b”、“c”、“d”],
“p2”:[“a”、“b”、“c”],
“p3”:[“a”、“b”],
“p4”:[“a”、“b”、“c”、“d”],
“p5”:[“a”、“b”、“c”],
“p6”:[“a”、“b”],
“p7”:[“a”、“b”、“c”、“d”],
“p8”:[“a”、“b”、“c”],
“p9”:[“a”、“b”],
“p10”:[“a”、“b”、“c”、“d”],
“p11”:[“a”、“b”、“c”],
“p12”:[“a”、“b”],
“p13”:“无效”
}
对于项目,dict_issueType.items()中的issueType:
如果str(类型(issuetypes))==“”:
bool_dict_selected_issuetypes[project]=[BooleanVar()表示范围内的i(len(issuetypes))]
选定的_issueType[项目]=[]
r=c=0
fr=0
color=“白色”
对于项目,dict_issueType.items()中的issueType:
帧1=帧(帧,背景=颜色)
frame1.grid(row=fr,columnspan=3,sticky='we')
如果str(类型(issuetypes))==“”:
标签(frame1,text=project,width=10,anchor=w',bg=color)。网格(row=r,column=c)
对于范围(0,len(issuetypes))中的i:
选中按钮(frame1,text=issuetypes[i],variable=bool\u dict\u selected\u issuetypes[project][i],bg=color)。网格(row=r,column=c+1,sticky=w')
r=r+1
其他:
标签(frame1,text=issuetypes+'\n',bg=color).网格(row=r,column=c+1)
r=r+1
r=r+1
fr=fr+1
如果颜色=“白色”:
color=“灰色”
其他:
color=“白色”
高度=root.winfo_屏幕高度()
width=root.winfo_screenwidth()
几何图形(str(宽度)+'x'+str(高度-100)+'+'+'0'+'+'+'+'0')
项目标签=标签(root,text=“输入项目密钥/id:-”)
项目标签网格(行=0,列=0,padx=10,pady=10)
项目\条目=条目(根,宽度=100)
项目输入。插入(0,“在此处输入”)
项目输入网格(行=0,列=1,padx=10,pady=10)
获取发布按钮=按钮(root,text=“获取发布类型”,command=get发布类型)
获取按钮网格(行=0,列=2,padx=10,pady=10)
框架=文本(根)
frame.grid(行=1,列span=3,粘滞=nsew',padx=2,pady=2)
frame.grid\u columnconfigure(0,权重=1)
frame.grid_rowconfigure(0,权重=1)
v=滚动条(根,命令=frame.yview)
v、 网格(行=1,列=3,粘性=nsew')
帧['yscrollcommand']=v.set
frame.config(font=(“consolas”,12),undo=True,wrap='word')
root.mainloop()

您不能使用
网格
将小部件放入文本小部件中。文本小部件只能滚动添加了
window\u create
的其他小部件。您还需要确保在使用
window\u create
添加的每个小部件之后添加一个换行符

下面是一个人为的例子:

import tkinter as tk

root = tk.Tk()
text = tk.Text(root)
ysb = tk.Scrollbar(root, orient='vertical', command=text.yview)
text.configure(yscrollcommand=ysb.set)

ysb.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)

vars = []
for i in range(100):
    var = tk.IntVar(value=0)
    vars.append(var)
    f = tk.Frame(text)
    cb = tk.Checkbutton(f, onvalue=1, offvalue=0, text=f"Item {i}", variable=var)
    cb.pack(side="left")
    text.window_create("end", window=f)
    text.insert("end", "\n")

root.mainloop()

您不能使用
grid
将小部件放入文本小部件中。文本小部件只能滚动添加了
window\u create
的其他小部件。您还需要确保在使用
window\u create
添加的每个小部件之后添加一个换行符

下面是一个人为的例子:

import tkinter as tk

root = tk.Tk()
text = tk.Text(root)
ysb = tk.Scrollbar(root, orient='vertical', command=text.yview)
text.configure(yscrollcommand=ysb.set)

ysb.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)

vars = []
for i in range(100):
    var = tk.IntVar(value=0)
    vars.append(var)
    f = tk.Frame(text)
    cb = tk.Checkbutton(f, onvalue=1, offvalue=0, text=f"Item {i}", variable=var)
    cb.pack(side="left")
    text.window_create("end", window=f)
    text.insert("end", "\n")

root.mainloop()

您不应该使用
frame1.grid(…)
如果您想在
文本
小部件中放置一个框架,请使用
frame.window\u create('end',window=frame1)
来代替
frame.insert('end','\n')
以便每行放置一个框架。您不应该使用
frame1.grid(…)
如果要在
文本
小部件中放置框架,请使用
frame.window\u create('end',window=frame1)
代替
frame.insert('end','\n')
,以便每行放置一个框架。