включить две кнопки календаря ttk в окне графического интерфейса, Python 2.7 - PullRequest
0 голосов
/ 28 июня 2019

Из этого поста я узнал, как реализовать календарь ttk Python Tkinter ttk calendar Все, что мне нужно, - это включить две кнопки ttk calendars в мой графический интерфейс.Одна для кнопки «Дата прибытия», а другая для кнопки «Дата возвращения».Однако после того, как я попытался включить эти две кнопки в окно GUI, мое окно GUI становится очень медленным и медленно загружается, а иногда даже зависает.Кто-нибудь может дать мне какое-то предложение о том, в чем здесь проблема?

Основываясь на ссылке выше, я попытался сначала включить кнопку ttk calendar, и все работает нормально, и мое окно графического интерфейса работает плавно.Тем не менее, до тех пор, пока у меня есть две кнопки календаря 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 голосов
/ 08 июля 2019

Я не воспроизводлю ваше замедление на Windows с Python 3.7. Ваш пример не совсем завершен, поэтому я протестировал ниже.

Возможная пропущенная причина замедления - наличие конфликтующего управления геометрией колоды и сетки в одном кадре. Мы не можем видеть это из предоставленного кода. В приведенном ниже примере вы можете pack текстовый виджет и посмотреть, если это вызывает проблемы. В версии Tkinter с Python 3.7 выполнение обеих упаковочных сеток в одном и том же фрейме вызовет ошибку, но в зависимости от используемой версии 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:]))
...