在GUI窗口中包括两个ttk日历按钮python 2.7

时间:2019-06-28 18:29:24

标签: python-2.7 tkinter ttk

我从这篇文章Python Tkinter ttk calendar了解了如何实现ttk日历 我只需要在GUI界面中包含两个ttk日历按钮。一个用于“到达日期”按钮,另一个用于“返回日期”按钮。但是,在尝试将这两个按钮包含在GUI窗口中之后,GUI窗口变得非常笨拙且加载缓慢,有时甚至冻结。有人可以给我一些关于这里问题的建议吗?

基于上面的链接,我尝试首先在ttk日历按钮上添加该按钮,并且一切正常,并且GUI窗口运行顺利。但是,只要我有两个ttk日历按钮,整个GUI窗口就会很滞后。

# from stackoverflow
# https://stackoverflow.com/questions/48298195/python-tkinter-ttk-calendar
class MyDateEntry(DateEntry):
    def __init__(self, master=None, **kw):
        DateEntry.__init__(self, master=master, **kw)
        # add black border around drop-down calendar
        self._top_cal.configure(bg='black', bd=1)
        # add label displaying today's date below
        tk.Label(self._top_cal, bg='gray90', anchor='w',
                 text='Today: %s' % date.today().strftime('%x')).pack(fill='x')

...
...
...



# first button
ttk.Label(self.frame_entry_left_col, text='Arrival Date:').grid(row=6, column=0, padx=5, pady=(5, 0), sticky=tk.W)
self.fldArrivalDate = MyDateEntry(self.color, master=self.frame_entry_left_col, font=("Calibri", 8), background=self.color.secondary, width=17, selectmode='day')
self.fldArrivalDate.grid(row=7, column=0, padx=5, pady=(0, 6))

# second button
ttk.Label(self.frame_entry_left_col, text='Return Date:').grid(row=8, column=0, padx=5, pady=(5, 0), sticky=tk.W)
self.fldReturnDate = MyDateEntry(self.color, master=self.frame_entry_left_col, font=("Calibri", 8), width=17, selectmode='day')
self.fldReturnDate.grid(row=9, column=0, padx=5, pady=(0, 6))

我希望两个按钮都能正常工作。

1 个答案:

答案 0 :(得分:0)

我不会在使用Python 3.7的Windows上重现您的速度下降问题。您的示例还不够完整,因此我在下面进行了实际测试。

可能的丢失原因是,如果您在单个框架中使用了相互冲突的包装和网格几何管理。从提供的代码中我们看不到这一点。在下面的示例中,您可以pack文本小部件并查看是否引起问题。在带有Python 3.7的Tkinter版本中,在同一帧中同时执行两个打包网格都会引发错误,但是根据所使用的Tk版本,在python 2.7上可能不会发生此错误,并在某一时刻导致Tk锁定,因为几何经理互相对抗。

# https://stackoverflow.com/q/56811713/291641
#
# pip install tkcalendar

import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkcalendar import DateEntry
from datetime import date

class MyDateEntry(DateEntry):
    def __init__(self, master=None, **kw):
        DateEntry.__init__(self, master=master, **kw)
        # add black border around drop-down calendar
        self._top_cal.configure(bg='black', bd=1)
        # add label displaying today's date below
        tk.Label(self._top_cal, bg='gray90', anchor='w',
                 text='Today: %s' % date.today().strftime('%x')).pack(fill='x')

def main(args=None):
    root = tk.Tk()
    frame = ttk.Frame(root)

    row = 0
    for name in ['Arrival' , 'Departure']:
        label = ttk.Label(frame, text=name + ': ')
        cal = MyDateEntry(master=frame, width=17, selectmode='day')
        label.grid(row=row, column=0, sticky='news')
        cal.grid(row=row, column=1, sticky='news')
        row += 1

    text = tk.Text(frame)
    text.grid(row=row, columnspan=2, sticky='news')

    frame.grid_rowconfigure(row, weight=1)
    frame.grid_columnconfigure(1, weight=1)
    frame.grid(row=0, column=0, sticky='news')

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.mainloop()
    return 0

if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))