我正在尝试为我的python脚本创建GUI。当我按下“获取问题类型”按钮时,我从一个函数中获取了一个字典(在代码中,我刚刚获取了一个示例字典)。
对于每个项目(例如p1),我为列表中的所有元素创建一个复选框。
我为每个项目创建一个框架,所有这些框架都在文本框内(因为框架不支持在tkinter中滚动)
当字典的大小很大时,文本框会缩放并超出窗口大小,并且滚动条不起作用。
我如何使滚动条工作?
这是上述应用的代码
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()
答案 0 :(得分:0)
您不能使用grid
将小部件放置在文本小部件内。文本小部件只能滚动添加了window_create
的其他小部件。您还需要确保在每个用window_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()