Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么打开Tkinter GUI时会在视觉上失去焦点?_Python_User Interface_Tkinter - Fatal编程技术网

Python 为什么打开Tkinter GUI时会在视觉上失去焦点?

Python 为什么打开Tkinter GUI时会在视觉上失去焦点?,python,user-interface,tkinter,Python,User Interface,Tkinter,当我打开我的GUI时,我可以输入它并做一些事情,但是OptionMenu和Button小部件看起来好像GUI没有焦点。一张图片来演示我的意思:(看看下拉菜单和按钮) 当我专注于一个不同的应用程序,然后再次点击我的GUI,它有正确的颜色,如果它在焦点上,应该在那里。再次展示一幅图片,让我的意思更加清晰: 所以我的问题是,有人知道为什么会发生这种情况吗?我应该做些什么,这样当我第一次打开GUI时,GUI也能在视觉上聚焦 我知道上传所有这些代码是不好的做法,因为最好上传一个最小的可复制示例,但我认

当我打开我的GUI时,我可以输入它并做一些事情,但是OptionMenu和Button小部件看起来好像GUI没有焦点。一张图片来演示我的意思:(看看下拉菜单和按钮)

当我专注于一个不同的应用程序,然后再次点击我的GUI,它有正确的颜色,如果它在焦点上,应该在那里。再次展示一幅图片,让我的意思更加清晰:

所以我的问题是,有人知道为什么会发生这种情况吗?我应该做些什么,这样当我第一次打开GUI时,GUI也能在视觉上聚焦

我知道上传所有这些代码是不好的做法,因为最好上传一个最小的可复制示例,但我认为每个小细节在这里都很重要,这就是为什么会发生这种情况。因此,我决定上传一段用于GUI的较大代码

from tkinter import *
from tkinter import messagebox
from tkinter import font as tkfont

root = Tk()
root.config(background='#009688')
root.title('Contractmaker')

# GUI stuff that takes care of the scrollbar
def on_configure(event):
    canvas.configure(scrollregion=canvas.bbox('all'))

def on_mousewheel(event):
    canvas.yview_scroll(int(event.delta), 'units')

# Create some fonts
bold_font = tkfont.Font(weight='bold')

# Create the actual GUI
canvas = Canvas(root, width=450, height=550)
canvas.config(background='#009688')
canvas.pack(side=RIGHT)

scrollbar = Scrollbar(root, command=canvas.yview)
# scrollbar.pack(side=RIGHT, fill='y')

canvas.configure(yscrollcommand=scrollbar.set)
canvas.bind('<Configure>', on_configure)
canvas.bind_all('<MouseWheel>', on_mousewheel)

frame = Frame(canvas)
frame.config(background='#009688')
canvas.create_window((0,0), window=frame)

labelNaamhuurder = Label(frame, text='Naam huurder', bg='#009688', font=bold_font).grid(row=0, column=0, sticky=W, padx=(30, 0), pady=(15, 0))
naamhuurderr = Entry(frame, textvariable=naamhuurder, relief=FLAT, highlightcolor='#9DCCFD')
naamhuurderr.grid(row=0, column=2, pady=(15, 0))

# All the other rows are the same as the one above so I decided to leave them out 

labelAdresapp = Label(frame, text='Adres appartement', bg='#009688', font=bold_font).grid(row=5, column=0, pady=(15, 0), sticky=W, padx=(30, 0))
appartementen = {'Slotlaan 73', 'Slotlaan 77', 'Albert Cuypstraat 22'}
adresapp.set('Slotlaan 73') # Default option
dropdownMenuhuur = OptionMenu(frame, adresapp, *appartementen)
dropdownMenuhuur.config(width=18)
dropdownMenuhuur.grid(row=5, column=2, pady=(15, 0))

labelTypekamer = Label(frame, text='Type kamer', bg='#009688', font=bold_font).grid(row=6, column=0, pady=(15, 0), sticky=W, padx=(30, 0))
typeKamers = {'Grote kamer', 'Kleine kamer', 'Grote kamer gedeeld'}
typekamer.set('Grote kamer') # Default option
dropdownMenutypekamer = OptionMenu(frame, typekamer, *typeKamers)
dropdownMenutypekamer.config(width=18)
dropdownMenutypekamer.grid(row=6, column=2, pady=(15, 0))

empty = Button(frame, text='Opnieuw', command=clear, font=bold_font)
empty.config(width=10, fg='#009688', borderwidth=0, relief=RAISED)
empty.configure(highlightbackground='#009688')
empty.grid(row=11, column=0, pady=(25, 0), padx=(80, 0))

converter = Button(frame, text='OK', command=contractupdater, font=bold_font)
converter.config(width=10, fg='#009688', borderwidth=2, relief=RAISED)
converter.configure(highlightbackground='#009688')
converter.grid(row=11, column=2, pady=(25, 0), padx=(0, 80))

root.mainloop()
从tkinter导入*
从tkinter导入消息框
从tkinter导入字体作为tkfont
root=Tk()
root.config(后台='#009688')
root.title('Contractmaker')
#GUI的东西,照顾滚动条
def on_配置(事件):
configure(scrollregion=canvas.bbox('all'))
鼠标滚轮上的def(事件):
canvas.yview_滚动(int(event.delta),“units”)
#创建一些字体
bold\u font=tkfont.font(weight='bold')
#创建实际的GUI
画布=画布(根,宽度=450,高度=550)
canvas.config(后台='#009688')
canvas.pack(侧面=右侧)
scrollbar=scrollbar(根,命令=canvas.yview)
#scrollbar.pack(side=RIGHT,fill='y')
configure(yscrollcommand=scrollbar.set)
canvas.bind(“”,在配置上)
画布。绑定所有(“”,在鼠标滚轮上)
框架=框架(画布)
frame.config(背景='#009688')
canvas.create_window((0,0),window=frame)
labelNaamhuurder=Label(frame,text='Naam huurder',bg='#009688',font=bold_font).网格(行=0,列=0,粘滞=W,padx=(30,0),pady=(15,0))
naamhuurderr=Entry(框架,textvariable=naamhuurder,浮雕=FLAT,highlightcolor='#9DCCFD')
naamhuurderr.grid(行=0,列=2,pady=(15,0))
#所有其他行都与上面的行相同,所以我决定将它们删掉
labelAdresapp=Label(frame,text='Adres appartement',bg='#009688',font=bold_font).网格(行=5,列=0,pady=(15,0),粘滞=W,padx=(30,0))
公寓={'Slotlan 73','Slotlan 77','Albert Cuypstraat 22'}
ADRESAP.set('SLOTLAN 73')#默认选项
下拉菜单UUR=选项菜单(帧、地址、*装置)
dropdownMenuhuur.config(宽度=18)
DropDownMenuUur.grid(行=5,列=2,pady=(15,0))
labelTypekamer=Label(frame,text='Type kamer',bg='#009688',font=bold_font).网格(行=6,列=0,pady=(15,0),粘滞=W,padx=(30,0))
typeKamers={'Grote kamer','Kleine kamer','Grote kamer gedeeld'}
typekamer.set('Grote-kamer')#默认选项
dropdownMenutypekamer=选项菜单(框架、typekamer、*typeKamers)
dropdownMenutypekamer.config(宽度=18)
dropdownMenutypekamer.grid(行=6,列=2,pady=(15,0))
空=按钮(框,text='Opnieuw',command=clear,font=bold\u font)
empty.config(width=10,fg='#009688',borderwidth=0,relieve=RAISED)
空。配置(highlightbackground='#009688')
空的.grid(行=11,列=0,pady=(25,0),padx=(80,0))
converter=按钮(框架,text='OK',command=contractupdater,font=bold\u font)
converter.config(宽度=10,fg='#009688',边框宽度=2,浮雕=凸起)
converter.configure(highlightbackground='#009688')
grid(行=11,列=2,pady=(25,0),padx=(0,80))
root.mainloop()

更详细地说:这基本上是一个关于

的后续问题,我不确定这是否是解决此问题的正确方法,但它是有效的。因此,通过使用
root.update()
我能够解决这个问题,但这导致了另一个问题,即在开始时闪烁窗口从默认值更改大小,这也可以通过此解决

。。。
root=tk.tk()
root.wm_draw()#隐藏窗口(未映射)
root.update()#隐藏窗口时更新窗口
...
...
#在主循环之前再次显示窗口,延迟1ms。
根.后(1,根.去锥化)
root.mainloop()

这应该可以在一开始就集中精力解决您的问题,否则请告诉我。

@jem:我很高兴这能奏效。基本上,重点是主窗口,但如果我们在不使用
root.wm_draw()
的情况下更新窗口,它将在开始时在屏幕上闪烁一次,以避免我先隐藏窗口,然后在隐藏时更新窗口,然后在执行
mainloop
后1ms后显示窗口。我不知道我是否解释得很好。啊,是的,对于像我这样的初学者来说,这是有道理的。如果我错了,请纠正我,但它第一次打开时可能有错误。因此,您必须撤回该窗口,更新它(这显然消除了bug),然后用root.after再次显示它。是否也有一个原因,你必须把根。之后,就在主顶部之前?我不能在更新后立即将其放置吗?我尝试将其放置在
update()
之后,但它不起作用,我的猜测是,当我们向窗口添加小部件时,窗口会自动更改其大小以适应它们,以便在窗口知道其最终大小更合适时放置。但是,如果您声明一个固定的大小,例如
root.geometry(“200x200”)
,那么,在这种情况下,我们甚至不需要仅通过使用
root.update()
来隐藏窗口。在开始时,应该可以为所有人实现这一点。