Python 在Macintosh(10.13.6)上使用Tkinter OptionMenu()小部件时出现奇怪的视觉行为

Python 在Macintosh(10.13.6)上使用Tkinter OptionMenu()小部件时出现奇怪的视觉行为,python,tkinter,Python,Tkinter,我正在使用一个GUI,让用户可以选择许多不同的颜色映射 问题是当选项菜单()的下拉列表接近屏幕底部时,整个框会向下移动到一个奇怪的位置。 我不确定这是一个bug还是我做错了什么。下面提供的示例代码,以及列表框下移前后发生的情况的图像(左和右分别有7个和8个以上的其他小部件) 请注意,如果您试图重现问题,您的解决方案可能需要较长的列表/较低的下拉列表 from tkinter import * class GUI(Tk): def __init__(self): Tk._

我正在使用一个GUI,让用户可以选择许多不同的颜色映射

问题是当
选项菜单()的下拉列表接近屏幕底部时,整个框会向下移动到一个奇怪的位置。

我不确定这是一个bug还是我做错了什么。下面提供的示例代码,以及列表框下移前后发生的情况的图像(左和右分别有7个和8个以上的其他小部件)

请注意,如果您试图重现问题,您的解决方案可能需要较长的列表/较低的下拉列表

from tkinter import *

class GUI(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.initGUI()

    def initGUI(self):
        self.cmapchoice = StringVar()
        self.cmapchoice.set('jet')
        self.cmaps = sorted(['viridis', 'plasma', 'inferno', 'magma','binary', 
            'bone','spring', 'summer', 'autumn', 'winter', 'cool','hot','copper','Spectral', 
            'coolwarm', 'bwr', 'seismic','twilight', 'hsv', 'Paired', 'Accent', 'prism', 'ocean', 
            'terrain','brg', 'rainbow', 'jet'],key=lambda s: s.lower())
        for i in range(8): # Change this to 7 to "fix" the issue
            Label(self,text='OTHER WIDGETS').grid(row=i, column=1, sticky='WE')
        OptionMenu(self,self.cmapchoice,*self.cmaps).grid(row=9, column=1, sticky='WE')

if __name__ == "__main__":
    MainWindow = GUI()
    MainWindow.mainloop()

虽然我仍然不确定该如何处理这个行为,但我了解到来自ttk的Combobox小部件无论如何要好得多,因为它更紧凑,在打开时不会占据整个屏幕。

虽然我仍然不确定该如何处理这个行为,但我了解到来自ttk的Combobox小部件无论如何要好得多,因为它更紧凑,并且在打开时不占用整个屏幕。

可以解决此问题,尽管这不是问题的确切解决方法,但解决了问题。如果打开上面的菜单(OptionMenu小部件,没有任何下拉菜单),则它将永远不会移动到屏幕底部

下拉菜单的方向可以用
菜单按钮的参数设置。就像这样

op=OptionMenu(…)
op[“方向”]=“上方”
完整示例

从tkinter导入*
类GUI(Tk):
定义初始化(自):
Tk.\uuuuuu初始(自我)
self.initGUI()
def initGUI(self):
self.cmapchoice=StringVar()
self.cmapchoice.set('jet')
self.cmaps=已排序(['viridis'、'plasma'、'inferno'、'magma'、'binary',
‘骨头’、‘春天’、‘夏天’、‘秋天’、‘冬天’、‘凉爽’、‘炎热’、‘铜’、‘光谱’,
“酷热”、“沸水反应堆”、“地震”、“曙光”、“高速列车”、“成对”、“重音”、“棱镜”、“海洋”,
‘地形’、‘brg’、‘彩虹’、‘喷气机’],键=lambda s:s.lower()
对于范围(8)中的i:#将此更改为7以“修复”问题
标签(self,text='OTHER WIDGETS').grid(row=i,column=1,sticky='WE')
op=选项菜单(self,self.cmapchoice,*self.cmaps)
op.grid(行=9,列=1,sticky='WE')
op[“方向”]=“上方”
如果名称=“\uuuuu main\uuuuuuuu”:
MainWindow=GUI()
MainWindow.mainloop()

这个问题可以有一个解决办法,虽然这不是问题的确切解决办法,但可以解决问题。如果打开上面的菜单(OptionMenu小部件,没有任何下拉菜单),则它将永远不会移动到屏幕底部

下拉菜单的方向可以用
菜单按钮的参数设置。就像这样

op=OptionMenu(…)
op[“方向”]=“上方”
完整示例

从tkinter导入*
类GUI(Tk):
定义初始化(自):
Tk.\uuuuuu初始(自我)
self.initGUI()
def initGUI(self):
self.cmapchoice=StringVar()
self.cmapchoice.set('jet')
self.cmaps=已排序(['viridis'、'plasma'、'inferno'、'magma'、'binary',
‘骨头’、‘春天’、‘夏天’、‘秋天’、‘冬天’、‘凉爽’、‘炎热’、‘铜’、‘光谱’,
“酷热”、“沸水反应堆”、“地震”、“曙光”、“高速列车”、“成对”、“重音”、“棱镜”、“海洋”,
‘地形’、‘brg’、‘彩虹’、‘喷气机’],键=lambda s:s.lower()
对于范围(8)中的i:#将此更改为7以“修复”问题
标签(self,text='OTHER WIDGETS').grid(row=i,column=1,sticky='WE')
op=选项菜单(self,self.cmapchoice,*self.cmaps)
op.grid(行=9,列=1,sticky='WE')
op[“方向”]=“上方”
如果名称=“\uuuuu main\uuuuuuuu”:
MainWindow=GUI()
MainWindow.mainloop()

如果mac上有人想重现问题,只需在
GUI
类中添加
self.geometry('+100+250')
。根据屏幕大小可能会有所不同。如果mac上的任何人想要重现该问题,只需在
GUI
类中添加
self.geometry(“+100+250”)
。根据屏幕大小的不同,可能会有所不同。