python-3.x - 带有网格的tkinter滚动条,它没有链接
问题描述
我正在学习 GUI,所以请理解下面我糟糕的代码。
我试图制作一个获取游戏角色信息的程序。因此,如果您按下“搜索”按钮,列表将显示在下方。但是......由于窗口大小,它只显示大约 11 个名称。所以我想为该区域放置一个滚动条,但我只是不知道如何链接滚动条来控制该区域。我的意思是,滚动条本身已经创建,它确实会滚动,但它不会滚动我想要的窗口。我一定是把它链接错了,但是……不确定。
下面是最小化的示例代码,但它仍然很长而且很粗糙。再次抱歉。如果有人能启发我,这对我的工作和我未来的工作都会有很大的帮助。
import tkinter as tk
import requests
from bs4 import BeautifulSoup
import webbrowser
import time
global var_dict, input_id, output
var_dict = {}
def enter_call_back(event=None):
output.grid(column = 0, row = 2, columnspan = 5 , sticky='w')
output.insert(tk.END,"Text_Something")
output.update()
search_chr()
def open_browse(url_list):
for url in url_list:
time.sleep(0.3)
webbrowser.open(url)
def search_inven(ch_id):
if ch_id == "ch1" or ch_id == "ch13" or ch_id == "ch15" :
num = 5
url_list = ["something.url","something2.url"]
self_count = 1
else:
num = 0
url_list = []
self_count = 0
masterset = []
masterset.append(num)
masterset.append(url_list)
masterset.append(self_count)
return masterset
def search_chr():
global var_dict, output
for things in var_dict.keys():
var_dict[things].destroy()
chr_list = ["ch1","ch2","ch3","ch4","ch5","ch6","ch7","ch8","ch9","ch9","ch10","ch11","ch12","ch13","ch14","ch15"]
output.insert(tk.END," Done! \n\n")
var_dict = {}
num = -1
for ch in chr_list:
num += 1
var_dict["output%s" %num] = tk.Entry(frame_buttons, width = 125)
result = search_inven(ch)
if result[0] == 0:
var_dict["output"+str(num)].insert(0, "Clean "+ch+"\n")
var_dict["output"+str(num)].grid(column = 0, row = num, sticky='w', padx=5, pady=5)
else:
url_list = result[1]
var_dict["o-button%s" %num] = tk.Button(frame_buttons, command=lambda url_list = url_list : open_browse(url_list))
var_dict["o-button"+str(num)].grid(column = 1, row = num, sticky='e')
var_dict["o-button"+str(num)].config(text="URL")
var_dict["output"+str(num)].insert(0, "Not Clean "+str(result[0])+" Self : "+str(result[2])+" Ch_id : "+ch+")\n")
var_dict["output"+str(num)].grid(column = 0, row = num, sticky='w', padx=5, pady=5)
vsb = tk.Scrollbar(frame_canvas, orient="vertical")
vsb.grid(row=0, column=1, sticky='ns')
vsb.config(command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
frame_canvas.config(height = 300)
canvas.config(scrollregion=canvas.bbox("all"))
root = tk.Tk()
root.geometry("760x710")
root.resizable(width=False, height=False)
root.title("Minimum v.1.2")
root.grid_rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
frame_main = tk.Frame(root, bg="gray")
frame_main.grid(sticky='news')
intro = tk.Text(frame_main, height = 17, bg="#E3D5F3")
intro.option_add("*Font", "명조 10")
intro.insert(tk.CURRENT,"Text_something")
intro.config(state='disabled')
intro.grid(row=0, column=0, pady=(5, 0), columnspan = 5, sticky='nw')
input_id = tk.Entry(frame_main, width = 35)
input_id.option_add("*Font","명조 10")
input_id.insert(0,"Ch_name")
input_id.grid(row=1, column=0, pady=(5, 0), sticky='w')
search_btn = tk.Button(frame_main)
search_btn.config(text="Search")
search_btn.option_add("*Font","명조 10")
search_btn.config(width=5,height=1)
search_btn.grid(row = 1, column = 0, pady=(5, 0), sticky='e')
output = tk.Text(frame_main, height = 10)
output.option_add("*Font","명조 10")
output.grid(row = 2, column = 0,pady=(5,0),sticky='nw')
frame_canvas = tk.Frame(frame_main, width = 565)
frame_canvas.grid(row=3, column=0, pady=(5, 0), columnspan = 3 ,sticky='nw')
frame_canvas.grid_rowconfigure(0, weight=1)
frame_canvas.grid_columnconfigure(0, weight=1)
frame_canvas.grid_propagate(False)
canvas = tk.Canvas(frame_canvas, bg="gray", height=500,scrollregion=(0,0,500,1800))
canvas.grid(row=0, column=0, sticky="news")
frame_buttons = tk.Frame(canvas, bg="gray")
frame_buttons.grid(row = 0, column = 0,sticky='e')
root.bind('<Return>',enter_call_back)
search_btn.config(command = enter_call_back)
root.mainloop()
解决方案
首先,使用grid()
放入frame_buttons
画布不会影响scrollregion
画布的效果。改为使用canvas.create_window()
。
其次,最好在绑定回调中绑定<Configure>
事件frame_buttons
并更新画布。scrollregion
然后添加小部件frame_buttons
将自动更新scrollregion
.
另请注意,您已经创建了新的scrollbar
并在执行时将其放在相同的位置search_chr()
。最好在函数之外创建scrollbar
唯一一次。
推荐阅读
- c++ - 为什么我可以通过 SubBase 类的公共继承方法打印出 Base 类的私有继承成员?
- javascript - 如何识别和存储 JavaScript 中字符串中存在的变量中的数字?
- android - 如何使用retrofit2从服务器获取list.size内部数据对象?
- angular - NgOnInit 在 Jasmine 测试中未订阅 mockActivatedRoute 中的 observable
- ios - 无法在 iOS 项目中安装 Pod
- ios - 来自 iOS 应用程序的 Twitter 身份验证问题
- access-token - 如何通过api获取vsts的访问令牌?
- ios - Decimal Pad 类型的键盘本地化
- sql - Select查询之间的速度差异
- python-3.x - 想要将客户聊天 URL 转换并保存为 wmv 文件