python - 可滚动窗口 tkinter 不水平跨越整个屏幕
问题描述
问题:
我在 tkinter 中制作了一个可滚动的画布,但它没有水平填充整个画布。我尝试在网格化时添加 weight = 1 和 columnspan = 2 和其他参数,但无法正确填充。如何使小部件跨越整个 x 轴?
代码:
from tkinter import *
from tkinter import ttk
import time
WIN_WIDTH = 800
WIN_HEIGHT = 600
PRIMARY_COLOUR = "#5AC1D0"
SECONDARY_COLOUR = "#7FDCA5"
FONT = "Courier"
class Display:
def __init__(self, tinstance):
__all__ = ["createDisplay", "updateDisplay", "destoryDisplay"]
self.tinstance = tinstance
def createDisplay(self, winresx, winresy, wintitle, useicon, iconpath):
self.tinstance.geometry("{}x{}+{}+{}".format(winresx, winresy, int(winresx / 2), int(winresy / 7)))
self.tinstance.title(wintitle)
#self.tinstance.resizable(0, 0)
self.tinstance.wm_attributes("-topmost", 1)
if useicon == True:
self.tinstance.call("wm", "iconphoto", self.tinstance._w, PhotoImage(file = iconpath))
def updateDisplay(self):
while True:
try:
self.tinstance.update_idletasks()
self.tinstance.update()
time.sleep(0.01)
except TclError:
pass
def destroyDisplay(self):
self.tinstance.destroy()
if __name__ == "__main__":
tk = Tk()
display = Display(tk)
display.createDisplay(WIN_WIDTH, WIN_HEIGHT, "Julie's Party Hire Store", True, "ico.png")
canvas = Canvas(tk, bg = PRIMARY_COLOUR, width = WIN_WIDTH, height = WIN_HEIGHT).grid(row = 0, column = 0)
title = Label(tk, text = "Welcome to Julie's Party Hire Store!", font = (FONT, 20), bg = SECONDARY_COLOUR)
title.grid(row = 0, column = 0, sticky = N)
#Scrollable window
scroll_wrapper = Frame(canvas)
scroll_canvas = Canvas(scroll_wrapper, bg = PRIMARY_COLOUR)
scroll_frame = Frame(scroll_canvas)
scroll_scrollbar = ttk.Scrollbar(scroll_wrapper, orient = "vertical", command = scroll_canvas.yview)
scroll_canvas.configure(yscrollcommand = scroll_scrollbar.set)
scroll_canvas.bind("<Configure>", lambda e: scroll_canvas.configure(scrollregion = scroll_canvas.bbox("all")))
scroll_canvas.create_window((0, 0), window = scroll_frame)
scroll_wrapper.grid(row = 0, column = 0, sticky = EW)
scroll_canvas.grid(row = 0, column = 0, sticky = EW)
scroll_scrollbar.grid(row = 0, column = 1, sticky = NS)
for i in range(1, 50):
b = Button(scroll_frame, text = "Button " + str(i)).grid(row = i, column = 0)
tk.mainloop()
解决方案
你试过这个方法columnconfigure(column, weight)
吗?
weight
决定了列将占据多宽,这是相对于其他列的。
columnconfigure(0, weight=1)
并且
columnconfigure(1, weight=0)
意味着column 0
它将占据相对于 的所有空间column 1
。
代码:
from tkinter import *
from tkinter import ttk
import time
WIN_WIDTH = 800
WIN_HEIGHT = 600
PRIMARY_COLOUR = "#5AC1D0"
SECONDARY_COLOUR = "#7FDCA5"
FONT = "Courier"
class Display:
def __init__(self, tinstance):
__all__ = ["createDisplay", "updateDisplay", "destoryDisplay"]
self.tinstance = tinstance
def createDisplay(self, winresx, winresy, wintitle, useicon, iconpath):
self.tinstance.geometry("{}x{}+{}+{}".format(winresx, winresy, int(winresx / 2), int(winresy / 7)))
self.tinstance.title(wintitle)
#self.tinstance.resizable(0, 0)
self.tinstance.wm_attributes("-topmost", 1)
#if useicon == True:
# self.tinstance.call("wm", "iconphoto", self.tinstance._w, PhotoImage(file = iconpath))
def updateDisplay(self):
while True:
try:
self.tinstance.update_idletasks()
self.tinstance.update()
time.sleep(0.01)
except TclError:
pass
def destroyDisplay(self):
self.tinstance.destroy()
if __name__ == "__main__":
tk = Tk()
display = Display(tk)
#display.createDisplay(WIN_WIDTH, WIN_HEIGHT, "Julie's Party Hire Store", True, "ico.png")
canvas = Canvas(tk, bg = PRIMARY_COLOUR, width = WIN_WIDTH, height = WIN_HEIGHT).grid(row = 0, column = 0)
title = Label(tk, text = "Welcome to Julie's Party Hire Store!", font = (FONT, 20), bg = SECONDARY_COLOUR)
title.grid(row = 0, column = 0, sticky = N)
#Scrollable window
scroll_wrapper = Frame(canvas)
scroll_wrapper.columnconfigure(0, weight=1)
scroll_wrapper.columnconfigure(1, weight=0)
scroll_canvas = Canvas(scroll_wrapper, bg = PRIMARY_COLOUR)
scroll_frame = Frame(scroll_canvas)
scroll_scrollbar = ttk.Scrollbar(scroll_wrapper, orient = "vertical", command = scroll_canvas.yview)
#ttk.Label(scroll_wrapper, text='test').grid(column=2)
scroll_canvas.configure(yscrollcommand = scroll_scrollbar.set)
scroll_canvas.bind("<Configure>", lambda e: scroll_canvas.configure(scrollregion = scroll_canvas.bbox("all")))
scroll_canvas.create_window((0, 0), window = scroll_frame)
scroll_wrapper.grid(row = 0, column = 0, sticky = EW)
scroll_canvas.grid(row = 0, column = 0, sticky = EW)
scroll_scrollbar.grid(row = 0, column = 1, sticky = NS)
for i in range(1, 50):
b = Button(scroll_frame, text = "Button " + str(i)).grid(row = i, column = 0)
tk.mainloop()
推荐阅读
- flutter - NoSuchMethodError 在 null 上调用了方法“[]”
- sabre - 座位图 (Bet)a 4.0.0 - 所有座位显示“SeatIsFree”
- django - Django Migrations 在以不正确的顺序执行后卡住
- powershell - Linux Copy-Item 到远程服务器上的 Powershell 失败,文件超过 275K
- r - R中的摘要和密度图
- python - 如何为每个批次暗示不同的损失函数
- javascript - 如何在自身上有一个 HTML 文本元素循环?
- javascript - 无法找到我的逻辑中断,尝试在我的 RMA 数据库中实现 CRUD 功能
- java - 在 java & c# 中加密密码并得到相同的结果
- python - Python requests.get 和不同服务器的线程