【发布时间】:2020-02-07 21:52:46
【问题描述】:
我只想首先说我对使用 tkinter 和 Python 进行编码非常陌生。希望你能帮帮我。
我正在尝试创建一个带有帮助部分的应用程序,该部分应该在单击按钮时使用 tkinter 作为顶层打开。 Toplevel 需要可滚动并在我调整 Toplevel 窗口大小时包装文本。
下面是一个工作代码,它为我提供了一个很好的可滚动窗口,但不会换行文本。底部的 Expl(300, 300) 位于从另一个具有主 tk.Tk() 窗口的 Python 文件调用的原始设置中。谁能给我关于包装功能如何工作的建议,以及我现在做错了什么?
import tkinter as tk
WIDTH = 500
HEIGHT = 500
BG = '#fff'
class Expl(tk.Frame):
def __init__(self, x, y):
self.x = x
self.y = y
self.width = round(WIDTH/2)
self.height = round(HEIGHT/1.8)
self.window = tk.Toplevel()
self.window.wm_geometry('%dx%d+%d+%d' % (self.width, self.height, max(0, self.x - (WIDTH/2 - WIDTH/2/2)), max(0, self.y - (HEIGHT/2 - HEIGHT/1.8/2))))
self.window.title('Förklaringar')
self.window.configure(background=BG)
#self.window.iconbitmap(default=ICON_PATH)
tk.Frame.__init__(self, self.window)
myframe=tk.Frame(self.window, width=self.width, height=self.height, bd=1, background=BG)
myframe.place(x=10,y=10)
self.canvas = tk.Canvas(self.window, borderwidth=0, background=BG)
self.frame = tk.Frame(self.canvas, background=BG)
self.vsb = tk.Scrollbar(self.window, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.canvas.bind_all("<MouseWheel>", self.onmousewheel)
self.frame.bind("<Configure>", self.myfunction)
self.frame.bind("<Configure>", self.onFrameConfigure)
self.vsb.pack(side="right", fill="y")
self.canvas.create_window((0,0),window=self.frame,anchor='nw')
self.canvas.pack(side="left", fill="both", expand=True)
self.window.grid_rowconfigure(0, weight=1)
self.window.grid_columnconfigure(0, weight=1)
self.draw()
def myfunction(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def onmousewheel(self, event):
self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def draw(self):
# Titles
tk.Label(self.frame, text='TEST 1').grid(row=0, column=0, sticky='SW', padx=10, pady=(5, 0))
tk.Label(self.frame, text='TEST 2').grid(row=1, column=0, sticky='SW', padx=10, pady=(5, 0))
tk.Label(self.frame, text='TEST 3').grid(row=2, column=0, sticky='SW', padx=10, pady=(5, 0))
texxt = WrappingLabel(self.frame, text="TESTTTTTT TTTTTTTT T IN RSG RSG SRG RSG")
texxt.grid(row=3, column=0, sticky='SW', padx=10, pady=(5, 0))
class WrappingLabel(tk.Label):
def __init__(self, master=None, **kwargs):
tk.Label.__init__(self, master, **kwargs)
self.bind('<Configure>', lambda _: self.config(wraplength=master.winfo_width()))
Expl(300, 300)
【问题讨论】:
-
如果您想要换行文本,为什么不使用
Text小部件而不是标签? -
问题不在于标签没有换行,问题在于它们所在的框架在您调整窗口大小时没有改变大小。
标签: python python-3.x tkinter