当前位置: 首页 > 知识库问答 >
问题:

画布

汪成仁
2023-03-14

我找到了几个与此相关的问题和答案,但没有一个解决方案让我明白为什么这段代码不起作用:

root=tk.Tk()

vscrollbar = tk.Scrollbar(root)

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set)

vscrollbar.config(command=c.yview)
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets

c.pack(side="left", fill="both", expand=True)
c.create_window(0,0,window=f)

testcontentA = tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).")
testcontentB = tk.Button(f,text="anytext")
testcontentA.pack()
testcontentB.pack()

f.pack()

c.config(scrollregion=c.bbox("all"))

root.mainloop()

我有一个tkinter窗口,其中动态生成了内容——这意味着如果屏幕上有两个或多个小部件要显示,则需要能够向下滚动。我希望能够用小部件填充框架“f”,然后使用画布。创建_window()函数以可滚动方式显示它。

现在显示窗口,但滚动条未启用-类似于滚动区域不正确或滚动条与画布之间的链接不正确。

共有3个答案

景俊拔
2023-03-14

很简单,您可以将c.create存储在元组中!

from tkinter import *
root = Tk()
c = Canvas(root, width=500, height=400).pack()
scroll = c.create_rectangle(225,175,175,225,fill='black'),c.create_rectangle(225,175,275,225)
while True:
      x1 = 1
      c.move(scroll,x1,0)
canvas.mainloop()
公西博实
2023-03-14
import tkinter as tk

root=tk.Tk()

vscrollbar = tk.Scrollbar(root)

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set)

vscrollbar.config(command=c.yview)
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets

c.pack(side="left", fill="both", expand=True)

#Updated the window creation
c.create_window(0,0,window=f, anchor='nw')

#Added more content here to activate the scroll
for i in range(100):
    tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).").pack()
    tk.Button(f,text="anytext").pack()

#Removed the frame packing
#f.pack()

#Updated the screen before calculating the scrollregion
root.update()
c.config(scrollregion=c.bbox("all"))

root.mainloop()

感谢布莱恩·奥克利的伟大回答。

翟迪
2023-03-14

如果要在画布中嵌入框架,则必须使用create_window,而不是pack。第一步是删除f.pack()

其次,您需要在tkinter有机会显示小部件后设置bbox,因为它们的大小在它们实际绘制在屏幕上之前无法计算。

实现这一点的简单方法是调用root。在调用c.config(scrollregion=c.bbox(“all”)之前更新(),或者计划在空闲后使用运行该命令。

代码中的另一个错误(我假设...)是您在(0,0)处创建窗口,但不设置锚。这意味着当我猜测您希望左上角位于(0,0)时,内部框架将以(0,0)为中心。

将您的create_window调用更改为如下所示:

c.create_window(0,0,window=f, anchor='nw')

 类似资料:
  • 在IE9画布中现在是否支持虚线/点线?目前我正在做与以下内容非常相似的事情: 这在IE7、IE8、IE9兼容模式和FireFox中工作很好,然而,在IE9和Chrome中,为每条虚线绘制一个实心笔画。 对为什么会发生这种情况有什么想法吗?

  • HTML5画布提供了绘制图像并完全擦除图像的必要方法。 我们可以使用Javascript帮助在HTML5画布上模拟好的动画。 以下是两个重要的Javascript方法,用于在画布上制作动画图像 - Sr.No. 方法和描述 1 setInterval(callback, time); 该方法在给定的time毫秒后重复执行所提供的代码。 2 setTimeout(callback, time); 此

  • 我的印象是,在JFrame上放置图形需要画布或JPanel,但我之前看到一个视频,其中一个人在扩展JFrame时使用绘画(graphics g),而没有制作面板或画布。如果是这样的话,为什么人们要费心制作画布或JPanel呢?

  • 有没有可能用画布在Android中实现下面的图片? 我想有一个洞,而不仅仅是在黄色的红色层上有一个圈。我在-method中使用以下代码进行了尝试(但失败了): 但是当我使用这段代码时,它在两个位图上都开了一个洞。最后,这个应用程序应该是一个带有球、洞和其他东西的迷宫。当球掉进洞里时,它应该出现在红色位图下。有可能实现这一点吗? 答: 如果有人也有同样的问题:使用View而不是SurfaceView

  • 我试着在画布里放一幅画。但就是没有出现。我谷歌了一下,看看哪里出了问题。不幸的是,我还是解决不了。这是我的代码 这是css文件

  • Sketch 里的画布尺寸是无限的。你可以用无限精准的分辨率无关模式来查看画布,或者打开像素模式来查看每一个像素导出后的样子。 如果你想在画布中设置一个固定的边框,你可以直接用画板 (Artboard) 工具创造一个新的画板。 导航 画布中的导航是非常容易的,你可以直接用鼠标滚轮滑动或者电脑的触摸板来控制方向。你还可以按住空格键,来使用抓手工具移动画布。并且,没有任何对象被选中的时候,你可以用方向