使根窗口可伸缩(tkinter,Python3.x)

本文介绍了一种方法,使得应用程序的窗口可以根据用户的操作进行伸缩,并且内部的插件能够自动填充多余的空间。通过使用行列尺寸管理技术,可以确保应用中的元素(如按钮)在窗口大小变化时仍能保持良好的布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使根窗口可伸缩

让用户可以放大缩小整个应用窗口,并将多余的空间分配给内部的插件。这需要一些操作。

为了让应用的插件可伸缩,需要用到行列尺寸管理的技术,详细参见 设置行,列尺寸

对于 最小的应用 中的应用,它只包含了一个 Quit 插件,如果运行这个应用,调整窗口的大小,按钮不会改变大小,一直保持在窗口的中央。

使用以下代码代替 最小的应用 中的 .createWidgets() 方法。这样, Quit 按钮就会始终填充整个窗口。

def createWidgets(self):
    top=self.winfo_toplevel()#1                
    top.rowconfigure(0, weight=1)#2            
    top.columnconfigure(0, weight=1)#3         
    self.rowconfigure(0, weight=1)#4           
    self.columnconfigure(0, weight=1)#5        
    self.quit = Button(self, text='Quit', command=self.quit)
    self.quit.grid(row=0, column=0,          
        sticky=tk.N+tk.S+tk.E+tk.W)#6
  1. ‘’top level window‘’是屏幕中最外层的窗口。但是,这个窗口不是你应用的窗口。调用任何插件的 .winfo_toplevel() 函数,可以达到 top-level 窗口。
  2. 这一行代码可以使,top level 窗口的第0行网格可伸缩。
  3. 这一行代码可以使,top level 窗口的第0列网格可伸缩。
  4. 这一行代码可以使,应用中第0行中插件的网格可伸缩。
  5. 这一行代码可以使,应用中第0列种插件的网格可伸缩。
  6. 通过设置参数 sticky=tk.N+tk.S+tk.E+tk.W 允许按钮通过伸缩来填充网格中的 cell 。

还需要改变一个地方。在构造函数 __init__() 中,将第二行改为一下内容:

def __init__(self, master=None):
   tk.Frame.__init__(self, master)
   self.grid(sticky=tk.N+tk.S+tk.E+tk.W)
   self.createWidgets()

必须设置 self.grid() 函数中的 sticky=tk.N+tk.S+tk.E+tk.W ,这样才会伸缩应用中的插件,填充 top-level 窗口的网格。

运行结果:

root_resize
注:本文翻译自新墨西哥理工大学计算机中心

用黄色方格代表蛇身,简易的小游戏。原文件:#!/usr/bin/python from Tkinter import * import random class snake(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.body = [(0,0)] self.bodyid = [] self.food = [ -1, -1 ] self.foodid = -1 self.gridcount = 10 self.size = 500 self.di = 3 self.speed = 500 self.top = self.winfo_toplevel() self.top.resizable(False, False) self.grid() self.canvas = Canvas(self) self.canvas.grid() self.canvas.config(width=self.size, height=self.size,relief=RIDGE) self.drawgrid() s = self.size/self.gridcount id = self.canvas.create_rectangle(self.body[0][0]*s,self.body[0][1]*s, (self.body[0][0]+1)*s, (self.body[0][1]+1)*s, fill="yellow") self.bodyid.insert(0, id) self.bind_all("<KeyRelease>", self.keyrelease) self.drawfood() self.after(self.speed, self.drawsnake) def drawgrid(self): s = self.size/self.gridcount for i in range(0, self.gridcount+1): self.canvas.create_line(i*s, 0, i*s, self.size) self.canvas.create_line(0, i*s, self.size, i*s) def drawsnake(self): s = self.size/self.gridcount head = self.body[0] new = [head[0], head[1]] if self.di == 1: new[1] = (head[1]-1) % self.gridcount elif self.di == 2: new[0] = (head[0]+1) % self.gridcount elif self.di == 3: new[1] = (head[1]+1) % self.gridcount else: new[0] = (head[0]-1) % self.gridcount next = ( new[0], new[1] ) if next in self.body: exit() elif next == (self.food[0], self.food[1]): self.body.insert(0, next) self.bodyid.insert(0, self.foodid) self.drawfood() else: tail = self.body.pop() id = self.bodyid.pop() self.canvas.move(id, (next[0]-tail[0])*s, (next[1]-tail[1])*s) self.body.insert(0, next) self.bodyid.insert(0, id) self.after(self.speed, self.drawsnake) def drawfood(self): s = self.size/self.gridcount x = random.randrange(0, self.gridcount) y = random.randrange(0, self.gridcount) while (x, y) in self.body: x = random.randrange(0, self.gridcount) y = random.randrange(0, self.gridcount) id = self.canvas.create_rectangle(x*s,y*s, (x+1)*s, (y+1)*s, fill="yellow") self.food[0] = x self.food[1] = y self.foodid = id def keyrelease(self, event): if event.keysym == "Up" and self.di != 3: self.di = 1 elif event.keysym == "Right" and self.di !=4: self.di = 2 elif event.keysym == "Down" and self.di != 1: self.di = 3 elif event.keysym == "Left" and self.di != 2: self.di = 4 app = snake() app.master.title("Greedy Snake") app.mainloop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值