【问题标题】:Tkinter - Using bind to resize frame dynamicallyTkinter - 使用绑定动态调整框架大小
【发布时间】:2019-02-19 13:05:55
【问题描述】:

我正在尝试创建一个 GUI 前端来使用 python tkinter 显示一些数据。

我有一个框架,它又具有其他小部件,例如按钮和列表框等。 每当光标放在框架的边框上时,我都试图动态地增加/减少框架,就像我们在用户端的普通窗口上所做的那样。

我已经完成了相同的绑定功能。 但看起来我错过了什么。

  def left_click(event):
      tkinter.Label(Frame1, text = "Left Click!").pack()



  self.Frame1 = Frame(top)        
  self.Frame1.place(relx=0.01, rely=0.152, relheight=0.678 , relwidth=0.98)
  self.Frame1.configure(relief=GROOVE)
  self.Frame1.configure(borderwidth="10")
  self.Frame1.configure(relief=GROOVE)
  self.Frame1.configure(background="#D1C8E6")
  self.Frame1.configure(width=900)
  self.Frame1.configure(highlightthickness="4")
  self.Frame1.bind("<Button-1>", left_click)

我是 python tk inter 的新手。

【问题讨论】:

  • 您发布的代码根本没有尝试调整您所说的框架大小是您的目标,因此很难准确说出您需要什么帮助。
  • 为什么你认为你错过了什么?程序在做什么与您的预期不同?
  • Bryan Oakley 我无法找出正确的绑定函数。您能否向我提供一些相同的链接或文档。

标签: python python-3.x tkinter


【解决方案1】:

你需要绑定以下鼠标事件来执行帧调整:

  • &lt;ButtonPress-1&gt;(按下鼠标左键)根据鼠标位置决定是否开始调整大小
  • &lt;ButtonRelease-1&gt;(松开鼠标左键)停止调整大小
  • &lt;Motion&gt;(鼠标在框架内移动)如果通过鼠标按下开始调整大小,则执行调整大小

下面是示例代码:

from tkinter import *

HORIZONTAL = 1
VERTICAL   = 2

class App:
    def __init__(self, top):
        self.Frame1 = Frame(top, bd=5, relief='raised', width=100, height=100)
        self.Frame1.place(x=10, y=10)
        self.Frame1.bind("<ButtonPress-1>", self.start_resize)
        self.Frame1.bind("<ButtonRelease-1>", self.stop_resize)
        self.Frame1.bind("<Motion>", self.resize_frame)
        self.resize_mode = 0
        self.cursor = ''

    def check_resize_mode(self, x, y):
        width, height = self.Frame1.cget('width'), self.Frame1.cget('height')
        mode = 0
        if x > width-10: mode |= HORIZONTAL    
        if y > height-10: mode |= VERTICAL
        return mode

    def start_resize(self, event):
        self.resize_mode = self.check_resize_mode(event.x, event.y)

    def resize_frame(self, event):
        if self.resize_mode:
            if self.resize_mode & HORIZONTAL:
                self.Frame1.config(width=event.x)
            if self.resize_mode & VERTICAL:
                self.Frame1.config(height=event.y)
        else:
            cursor = 'size' if self.check_resize_mode(event.x, event.y) else ''
            if cursor != self.cursor:
                self.Frame1.config(cursor=cursor)
                self.cursor = cursor

    def stop_resize(self, event):
        self.resize_mode = 0

root = Tk()
root.geometry("800x600+400+50")
App(root)
root.mainloop()

【讨论】:

  • acw1668 非常感谢。简直完美。
  • 样本很棒!
  • @acw1668 很好的答案。如果您想添加一些收尾工作,可以查看this。更具体地说,change_cursor_resizing 方法。它具有 Linux 和 Windows 的游标名称。
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多