我正在尝试创建一个与tkinter的接口。它应该在左边有一个控制面板,在右边有一组3个标签。在
选项卡将显示图像,对于屏幕来说可能太大了,但是确切的大小只有在程序动态创建之后才能知道。所以我想要一个Notebook
来填充顶部窗口,如果图像对于笔记本框架来说太大,滚动条应该显示出来,以便可以看到所有的图像。我找不到将滚动条附加到笔记本上的方法,所以我将它们附加到笔记本内部的画布上。在
我下面的代码扩展了画布以适应图像,但是滚动条是无用的,因为它拉伸以适应画布,画布比框架大,因此可能会出现在窗口之外。在
我想我想把scrollregion设置为包含帧的大小。Dynamically changing scrollregion of a canvas in Tkinter似乎有关联,但我不知道如何将其应用于我的代码:
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
class App(tk.Frame):
def __init__(self, parent, *args, **kwargs):
self.parent = parent
super().__init__(parent, *args, **kwargs)
self.pack(expand=True, fill=tk.BOTH)
self.inputframe = ttk.Frame(self)
self.inputframe.pack(side=tk.LEFT, expand=False, fill=tk.Y)
self.outputnotebook = ttk.Notebook(self)
self.outputnotebook.pack(side=tk.RIGHT, expand=True, fill=tk.BOTH)
self.build_inputframe()
self.build_outputnotebook()
def build_inputframe(self):
run_button = ttk.Button(self.inputframe, text="Run", command=self.draw)
run_button.grid(column=2, row=0, sticky=(tk.W, tk.E))
# rest of app...
def build_outputnotebook(self):
actnet_frame = ttk.Frame(self.outputnotebook)
critnet_frame = ttk.Frame(self.outputnotebook)
xscrollbar = ttk.Scrollbar(actnet_frame, orient=tk.HORIZONTAL)
xscrollbar.grid(row=1, column=0, sticky=tk.E + tk.W)
self.outputnotebook.add(
actnet_frame,
text="Tab 1",
sticky=tk.N + tk.S + tk.E + tk.W)
self.outputnotebook.add(critnet_frame, text="Tab 2")
self.actnet_canvas = tk.Canvas(actnet_frame, width=400, height=400,
xscrollcommand=xscrollbar.set)
self.actnet_canvas.grid(row=0, sticky=tk.N + tk.S + tk.E + tk.W)
xscrollbar.config(command=self.actnet_canvas.xview)
def draw(self):
act_image = Image.open('critnet.png') # image is 875 x 175
width, height = act_image.size
actphoto = ImageTk.PhotoImage(act_image)
self.actnet_canvas.delete("all")
self.actnet_canvas.create_image(0, 0, anchor=tk.NW, image=actphoto)
self.actnet_canvas.image = actphoto
self.actnet_canvas['scrollregion'] = (0, 0, width, height)
self.actnet_canvas['width'] = width
self.actnet_canvas['height'] = height
#do similar for other tabs.
root = tk.Tk()
root.geometry("800x600")
app = App(root)
app.mainloop()
代码中的问题是,将画布的大小调整为图片的大小,因此画布和滚动区域的大小是相同的。它会让你的画布变大,你的标签和滚动条就没用了。在
我抑制了线条
在
draw
函数中,滚动条的行为如预期。在编辑:我错过了问题的另一部分。为了调整画布和滚动条的大小,我在
^{pr2}$build_outputnotebook
中添加了以下行:相关问题 更多 >
编程相关推荐