Antony Tang 2021-08-12 18:28 采纳率: 80%
浏览 215
已结题

tkinter中绑定了Scrollbar滚动条的Canvas画布怎样才能触发滚动?

我试图用Python的tkinter模块和Canvas编写一个小的画图软件,当我在画布中打开一个图片时,发现图片的尺寸大于了我的画布尺寸,未能显示完全。
img
因此我给画布添加了滚动条:
img
结果发现,依然存在图片显示不完全的问题,而且滚动条是灰色的,根本无法滚动,明明跟画布绑定在一起了的。
img
以下是代码:

from tkinter import *
from tkinter import filedialog
from PIL import Image,ImageTk
def open_image():
    global img
    global painting
    while 1:
        try:
            img=Image.open(filedialog.askopenfilename(filetypes=[('PNG','png'), ('JPG','jpg'), ('GIF','gif')]))#,initiadir='D:/Python3/pythonc/python作品/程序设计参赛项目-唐铭鑫/paintings'))
            painting=ImageTk.PhotoImage(img)
            canvas.create_image(0,0,anchor=NW,image=painting)
            canvas.update()
            break
        except AttributeError:
            choice=messagebox.askretrycancel('图片打开错误','图片打开错误,是否重新选择图片')
            if choice==True:
                continue
            else:
                break
root=Tk()
paint_area=Frame(root,height=590,width=1140,bg='lightgrey',relief=GROOVE,borderwidth=8)
paint_area.pack()
paint_area_=Frame(paint_area,height=510,width=1080)
paint_area_.place(x=10,y=15)
canvas=Canvas(paint_area_,height=510,width=1080)
canvas_x_scrollbar=Scrollbar(paint_area_,orient=HORIZONTAL)
canvas_x_scrollbar.pack(side=BOTTOM,fill=X)
canvas_y_scrollbar=Scrollbar(paint_area_,orient=VERTICAL)
canvas_y_scrollbar.pack(side=RIGHT,fill=Y)
canvas.pack(side=LEFT,fill=BOTH,expand=True)
canvas_x_scrollbar.config(command=canvas.xview)
canvas_y_scrollbar.config(command=canvas.yview)
canvas.config(yscrollcommand=canvas_y_scrollbar.set,xscrollcommand=canvas_x_scrollbar.set,scrollregion=(0,0,200,200))
open_button=Button(root,text=' ==>打开图片<==',bg='gainsboro',relief='groove',width=14,padx=2,command=lambda:open_image())
open_button.pack()
root.mainloop()


有谁能告诉我这是为什么吗?

  • 写回答

1条回答 默认 最新

  • python xxxyyyxxxyyy 2021-08-12 21:54
    关注

    我觉得可能要在画布内绘制一个控件才能滚动:

    cv.create_window((0,0),window=frm,anchor='nw') # 在画布内绘制控件
    cv.configure(scrollregion=(0,0,frm.winfo_width(),max(cv.winfo_height(), frm.winfo_height()))) # 设定滚动范围,四个参数分别为左、上、右、下的拓展范围
    

    更多: https://blog.csdn.net/weixin_52132159/article/details/118583543 https://blog.csdn.net/weixin_52132159/article/details/118583543

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 8月12日

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置