canvas教程

Tkinter在canvas上调整大小滚动条不会调整

字号+ 作者:H5之家 来源:H5之家 2017-12-05 09:03 我要评论( )

Tkinter在canvas上调整大小滚动条不会调整(Tkinter on canvas resize scroll bar does not adjust) - IT屋-程序员软件开发技术分享社区

问 题

Although I believe my problem is simple, I just can't find an answer nor figure out how to fix this. Basically, I have a canvas that once a button is pressed it gets resized (like a zoom in), however, my scrolling bars do not adjust in order to cover the hole scrolling area.

Does anyone knows how to fix this?

Code: (somewhat nasty)

from Tkinter import * class Graphic(Tk): #Graphical Interface def __init__(self, x, y): #INITIALIZATION Tk.__init__(self) self.border = 10 self.size_x = x self.size_y = y self.mouse = "" self.cross_list = [] self.mode = "" #SIZE self.app_sizex = 1800 self.app_sizey = 1000 self.title("Graphic") self.geometry(str(self.app_sizex+10) + "x" + str(self.app_sizey+40)) #CANVAS + BORDER self.canvas = Canvas(self, width = self.app_sizex, height = self.app_sizey, scrollregion=(0,0,x,y)) self.canvas.grid(row=0, column=0, sticky="nsew") self.canvas.create_line(self.border, self.border, self.border, y-self.border) self.canvas.create_line(x-self.border, self.border, x-self.border, y-self.border) self.canvas.create_line(self.border, self.border, x-self.border, self.border) self.canvas.create_line(self.border, y-self.border, x-self.border, y-self.border) self.cross_x = self.canvas.create_line(self.border, self.border, self.border, self.border) self.cross_y = self.canvas.create_line(self.border, self.border, self.border, self.border) #SCROLLING BARS self.vbar=Scrollbar(self,orient=VERTICAL) self.vbar.grid(row=0, column=1, sticky="ns") self.vbar.config(command=self.canvas.yview) self.hbar=Scrollbar(self,orient=HORIZONTAL) self.hbar.grid(row=2, column=0, sticky="ew") self.hbar.config(command=self.canvas.xview) self.canvas.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set) #BUTTONS self.buttonframe = Frame(self) self.buttonframe.grid(row=1, column=0) Button(self.buttonframe, text = "+", command=self.zoom_in).grid(row=0, column=0) Button(self.buttonframe, text = "-").grid(row=0, column=1) self.canvas.bind("<1>", lambda event: self.canvas.focus_set()) self.canvas.bind("a", lambda event: self.canvas.xview_scroll(-1, "units")) self.canvas.bind("d", lambda event: self.canvas.xview_scroll( 1, "units")) self.canvas.bind("w", lambda event: self.canvas.yview_scroll(-1, "units")) self.canvas.bind("s", lambda event: self.canvas.yview_scroll( 1, "units")) self.canvas.focus_set() def zoom_in(self): #Clean canvas self.canvas.delete("all") self.size_x = self.size_x * 1.1 self.size_y = self.size_y * 1.1 x=self.size_x y=self.size_y self.canvas.scrollregion=(0,0,self.size_x,self.size_y) self.canvas.create_line(self.border, self.border, self.border, y-self.border) self.canvas.create_line(x-self.border, self.border, x-self.border, y-self.border) self.canvas.create_line(self.border, self.border, x-self.border, self.border) self.canvas.create_line(self.border, y-self.border, x-self.border, y-self.border) #SCROLLING BARS self.vbar.config(command=self.canvas.yview) self.hbar.config(command=self.canvas.xview) self.canvas.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set) graphics_window = Graphic(1000, 1000) graphics_window.mainloop()

解决方案

It took me a while without a Minimal, Complete, and Verifiable Example but I got something running that I think does what you had in mind. I took the liberty of adding something to look at when we zoomed. Check it out:

from tkinter import * class zoomer(Tk): def __init__(self): x=100 y=100 Tk.__init__(self) self.border = 10 self.size_x = x self.size_y = y #SIZE self.app_sizex = 200 self.app_sizey = 200 fontSize=int(x/20) self.title("Graphic") self.geometry(str(self.app_sizex+10) + "x" + str(self.app_sizey+40)) #CANVAS + BORDER self.canvas = Canvas(self, width = self.app_sizex, height = self.app_sizey, scrollregion=(0,0,x,y)) self.canvas.grid(row=0, column=0, sticky="nsew") self.canvas.create_line(self.border, self.border, self.border, y-self.border) self.canvas.create_line(x-self.border, self.border, x-self.border, y-self.border) self.canvas.create_line(self.border, self.border, x-self.border, self.border) self.canvas.create_line(self.border, y-self.border, x-self.border, y-self.border) self.canvas.create_line(self.border, self.border, x-self.border, y-self.border) text1=self.canvas.create_text(50, 50, fill="white",font=("Purisa", fontSize)) self.canvas.itemconfig(text1, text="Graphic Text") #SCROLLING BARS self.vbar=Scrollbar(self,orient=VERTICAL) self.vbar.grid(row=0, column=1, sticky="ns") self.vbar.config(command=self.canvas.yview) self.hbar=Scrollbar(self,orient=HORIZONTAL) self.hbar.grid(row=2, column=0, sticky="ew") self.hbar.config(command=self.canvas.xview) self.canvas.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set) #zoom button save_button = Button(self, text = "Zoom") save_button["command"] = lambda: self.zoom_in() save_button.grid(row=3, column = 0, pady = 5) def zoom_in(self): #Clean canvas self.canvas.delete("all") self.size_x = int(self.size_x * 1.1) self.size_y = int(self.size_y * 1.1) x=self.size_x y=self.size_y fontSize=int(x/20) self.canvas.create_line(self.border, self.border, self.border, y-self.border) self.canvas.create_line(x-self.border, self.border, x-self.border, y-self.border) self.canvas.create_line(self.border, self.border, x-self.border, self.border) self.canvas.create_line(self.border, y-self.border, x-self.border, y-self.border) self.canvas.create_line(self.border, self.border, x-self.border, y-self.border) text1=self.canvas.create_text(self.size_x/2, self.size_y/2, fill="white",font=("Purisa", fontSize) ) self.canvas.itemconfig(text1, text="Graphic Text") self.canvas.configure(scrollregion=self.canvas.bbox("all")) #SCROLLING BARS self.vbar.config(command=self.canvas.yview) self.hbar.config(command=self.canvas.xview) self.canvas.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set) if __name__ == '__main__': my_gui=zoomer() my_gui.mainloop()

I will leave what you were missing as an exercise. (That means I got it running but am too lazy to go back and figure out exactly what went wrong.)

本文地址:IT屋 » Tkinter on canvas resize scroll bar does not adjust

问 题

虽然我相信我的问题很简单,我只是找不到答案或找出如何解决这个问题。
基本上,我有一个画布,一旦一个按钮被按下它被调整大小(像放大),但是,我的滚动条不调整,以覆盖孔滚动区域。



有谁知道如何解决这个问题?



 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  •  教学工作坊(总第129期):混合式教学实用策略与CANVAS实操(在线报名)

    教学工作坊(总第129期):混合式教学实用策略与CANVAS实操(在线报名)

    2017-12-05 10:19

  • JS+canvas实现五子棋人机大战

    JS+canvas实现五子棋人机大战

    2017-12-05 08:00

  • 在Canvas上画图intro详解-绘图-界面API-微信小程序API-微信小程序开发教程

    在Canvas上画图intro详解-绘图-界面API-微信小程序API-微信小程序开

    2017-12-04 16:11

  • Canvas Login

    Canvas Login

    2017-12-04 16:10

网友点评