Как мне вызвать переменную c из def cal_fun () - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь вызвать переменную c в приведенном ниже коде.Это говорит, что cal не определен

def pay_cal():

    def cal_fun():
        t = Toplevel()
        global cal
        cal = Calendar(t, year=2019, month=6, day=1, foreground='Blue', background='White', selectmode='day')
        cal.pack()

    c = cal.get_date

    sub_win =Tk()
    sub_win.geometry('400x500+600+100')
    sub_win.title('Payout Calculator')

    l1 = Button(sub_win, text= 'Check-In Date:', command= cal_fun)
    chck_in_date = Label(sub_win, textvariable= c )
    l1.grid(row=1)
    chck_in_date.grid(row=1, column=2)

1 Ответ

0 голосов
/ 11 июня 2019

В вашем коде есть пара ошибок.Для начала вы определяете c как cal.get_date, когда cal еще даже не был создан.

Далее вы передаете c как textvariable для label виджета.Это не вызовет никакой ошибки, но также не будет обновлено - вам нужен объект StringVar.

У вас также нет механизма для обновления текстовой переменной при выборе календаря.Даже если ваш исходный код исправлен, дата будет обновляться только один раз после выполнения.

Вот как вы можете заставить все работать:

from tkinter import *
from tkcalendar import Calendar #I assume you are using tkcalendar

def pay_cal():

    def cal_fun():
        t = Toplevel()
        global cal
        cal = Calendar(t, year=2019, month=6, day=1, foreground='Blue', background='White', selectmode='day')
        cal.pack()
        cal.bind("<<CalendarSelected>>",lambda e: c.set(cal.get_date())) #make use of the virtual event to dynamically update the text variable c

    sub_win = Tk()
    sub_win.geometry('400x500+600+100')
    sub_win.title('Payout Calculator')
    c = StringVar() #create a stringvar here - note that you can only create it after the creation of a TK instance

    l1 = Button(sub_win, text= 'Check-In Date:', command= cal_fun)
    chck_in_date = Label(sub_win, textvariable=c)
    l1.grid(row=1)
    chck_in_date.grid(row=1, column=2)
    sub_win.mainloop()

pay_cal()

Наконец, я заметил, что вы используете sub_win в качестве переменнойимя для этой функции - это означает, что у вас может быть main_win что-то еще.Как правило, не рекомендуется использовать несколько экземпляров Tk - если вам нужны дополнительные окна, просто используйте Toplevel.

...