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

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 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡