python使固定框架而内部更大的画布

宽度或\和高度=尺寸

我有frame 300x300和一个canvas 600x600(框架内的画布)。

我想要frame的固定大小,因为如果更改canvas的大小->我的框架大小变得等于画布的宽度和高度!如何设置frame的固定大小,这样我的canvas将不会显示?

from tkinter import *

class MainWindow():
  def __init__(self):
    self.canvas_width = 600   # more than frame width
    self.canvas_height = 600  # more than frame height

    self.frame = Frame(root,width=300,height=300) # should be fixed in the window
    self.frame.grid(row=0,column=0)
    self.canvas = Canvas(self.frame,bg='bisque',width=self.canvas_width,height=self.canvas_height,scrollregion=(0,self.canvas_width,self.canvas_height))
    self.frame.propagate(False)

    self.hbar = Scrollbar(self.frame,orient=HORIZONTAL)
    self.hbar.pack(side=BOTTOM,fill=X)
    self.hbar.config(command=self.canvas.xview)

    self.vbar = Scrollbar(self.frame,orient=VERTICAL)
    self.vbar.pack(side=RIGHT,fill=Y)
    self.vbar.config(command=self.canvas.yview)

    # self.canvas.config(width=300,height=300)
    self.canvas.config(xscrollcommand=self.hbar.set,yscrollcommand=self.vbar.set)
    self.canvas.pack(side=LEFT,expand=True,fill=BOTH)

    self.canvas.bind("<ButtonPress-1>",self.scroll_start)
    self.canvas.bind("<B1-Motion>",self.scroll_move)

    self.grid(self.canvas)

  def grid(self,canvas):
    for line in range(0,self.canvas_height,10):
        canvas.create_line([(line,0),(line,self.canvas_height)],fill='#d9d9d9')
    for line in range(0,10):
        canvas.create_line([(0,line),(self.canvas_width,line)],fill='#d9d9d9')

  def scroll_start(self,event):
    self.canvas.scan_mark(event.x,event.y)

  def scroll_move(self,event):
    self.canvas.scan_dragto(event.x,event.y,gain=1)

if __name__ == '__main__':
  root = Tk()
  root.geometry('850x700')
  MainWindow()
  root.mainloop()

image

jzllong 回答:python使固定框架而内部更大的画布

您似乎对画布的工作方式有误解。您无需创建大画布。物理尺寸包含一个更大的虚拟画布。实际上,绝对不希望较大的画布被较小的框架部分隐藏,因为部分画布会被框架隐藏。

换句话说,如果您的屏幕上有300x300的画布,则仍可以像600x600或6000x6000或60000x60000一样在其中进行绘制。

您可以通过配置画布的scrollregion来执行此操作,该操作告诉画布您计划绘制多少空间。例如,如果画布的尺寸为300x300,但绘制时好像是600x600,您可以会像这样配置它:

canvas.configure(scrollregion=(0,599,599))

这是一个简单的示例,说明其工作原理。请注意,我们将对象放置在角落中,并且可以滚动查看所有四个角落。

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root,width=300,height=300,background="black")
ysb = tk.Scrollbar(root,command=canvas.yview,orient="vertical")
xsb = tk.Scrollbar(root,command=canvas.xview,orient="horizontal")
canvas.configure(yscrollcommand=ysb.set,xscrollcommand=xsb.set)

root.grid_rowconfigure(0,weight=1)
root.grid_columnconfigure(0,weight=1)

canvas.grid(row=0,column=0,sticky="nsew")
ysb.grid(row=0,column=1,sticky="ns")
xsb.grid(row=1,sticky="ew")

# designate that we want to draw in a 600x600 virtual canvas
canvas.configure(scrollregion=(0,599))

canvas.create_line(0,width=1,fill="white")
canvas.create_line(0,fill="white")
canvas.create_rectangle(0,19,fill="red")
canvas.create_rectangle(579,579,fill="red")
canvas.create_rectangle(0,fill="red")
canvas.create_rectangle(290,290,310,fill="green")

root.mainloop()
本文链接:https://www.f2er.com/3167070.html

大家都在问