【问题标题】:tkinter title frame change - struggling with event bind and functionstkinter 标题框架更改 - 与事件绑定和函数作斗争
【发布时间】:2020-01-24 21:42:59
【问题描述】:

我正在尝试更改 tkinter 标题框的颜色。我正在使用这里找到的结构Can I change the title bar in Tkinter?

我遇到了一些问题。我一直在修改代码并研究可能的解决方案,但感觉很困难。

Text_input_window= Tk()

def get_pos(event):
    xwin = Text_input_window.winfo_x()
    ywin = Text_input_window.winfo_y()
    startx = event.x_Text_input_window
    starty = event.y_Text_input_window

    ywin = ywin - starty
    xwin = xwin - startx


def move_window(event):
    Text_input_window.geometry("400x400"+'+{0}+{1}'.format(event.x_Text_input_window, event.y_Text_input_window))
    startx = event.x_Text_input_window
    starty = event.y_Text_input_window


Text_input_window.bind('<B1-Motion>', move_window)
Text_input_window.bind('<Button-1>', get_pos)

Text_input_window.overrideredirect(True) #removes default settings in Text_input_window
Text_input_window.geometry('460x250+300+200')

title_bar=Frame(Text_input_window, bg='SteelBlue1', relief='raised', bd=2)

这可能很明显,但我真的不知道这个人做了什么。我已经尝试了许多将函数放在不同部分的缩进排列 - 函数是否应该始终位于开头? 我认为这是我模仿的最好的版本。我得到一个颜色不同的窗口,右上角有一个“x”,它会自动关闭。但是窗口没有'移动,我得到的错误是:

startx = event.x_Text_input_window
AttributeError: 'Event' object has no attribute 'x_Text_input_window'

IDE 还显示 ywin、xwin、startx 和 starty 在starty = event.y_Text_input_window 行之后无法识别或变灰,就像它们没有工作一样。

【问题讨论】:

  • 请提供一个完整的可测试示例。您至少缺少导入和主循环。那就是说您永远不会将 title_bar 添加到您的窗口中。您缺少grid()pack()
  • 我想你误解了这个属性event.x_root。 x_root 不是因为根窗口在另一篇文章中被命名为 root。这只是属性名称,无论您如何称呼您的根窗口。所以使用event.x_root 而不是event.x_Text_input_window

标签: function events tkinter frame title


【解决方案1】:

您需要先解决 2 个问题。

  1. 我想你误解了这个属性 event.x_root。 x_root 不是因为根窗口在另一篇文章中被命名为 root。这只是属性名称,无论您如何称呼您的根窗口。所以使用event.x_root 而不是event.x_Text_input_window

  2. 您需要将框架实际放置在窗口上。如果您在该框架中没有任何小部件,则需要定义一个高度,以便您可以在窗口上实际看到它。

这是您的代码的工作版本:

import tkinter as tk


text_input_window = tk.Tk()


def get_pos(event):
    xwin = text_input_window.winfo_x()
    ywin = text_input_window.winfo_y()
    startx = event.x_root
    starty = event.y_root

    ywin = ywin - starty
    xwin = xwin - startx


def move_window(event):
    text_input_window.geometry("400x400"+'+{0}+{1}'.format(event.x_root, event.y_root))
    startx = event.x_root
    starty = event.y_root


text_input_window.overrideredirect(True)
text_input_window.geometry('460x250+300+200')
text_input_window.columnconfigure(0, weight=1)

title_bar = tk.Frame(text_input_window, height=25, bg='SteelBlue1', relief='raised', bd=5)
title_bar.grid(row=0, column=0, sticky='ew')


text_input_window.bind('<B1-Motion>', move_window)
text_input_window.bind('<Button-1>', get_pos)
text_input_window.mainloop()

结果:

【讨论】:

  • 这绝对有帮助。是的,我误解了“根”。我无法移动窗户。当我移动它时,小部件会迷失方向,我的光标会移到窗口的左上角。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多