我使用Python的日历控件。 我需要调用小部件单击按钮时。 的情况是,我无法找到是什么在显示的小部件本身的日历类中的方法。 Calendar类是从这里取: http://www.eurion.net/python-snippets/snippet/Calendar_Date%20picker.html
这里是我的进口:
from tkinter import *
from tkinter import ttk
import tkinter.messagebox
import time
import requests #needs to be installed
import pymysql #needs to be installed
import csv
import win32com.client #needs to be installed
from calendar import Calendar
import datetime
下面是创建按钮:
# Calendar Buttons
calBut=ttk.Button(f2, width=4, text="Cal", command=Calendar.what_method?).grid(column=3,row=1, sticky=W)
据我知道,我可以只设置按钮的命令来调用位于日历类窗口小部件显示方法。 如何让显示的日历我的每一个按钮被点击时间部件的方法? 的那些表示没有正在显示微件。
使用Python 3.3.5蜘蛛WinPython 3.3.5
**编辑**
该程序具有接片和F2表示的标签,其中该按钮会。
from tkinter import *
from tkinter import ttk
import tkinter.messagebox
import time
import requests #needs to be installed
import pymysql #needs to be installed
import csv
import win32com.client #needs to be installed
import datetime
from calendar import Calendar
import calendar
#################################
# Create Button Click Calendar
def callback():
root2=Toplevel(f2)
ttkcal = Calendar(root2,firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
root2.update()
root2.minsize(root2.winfo_reqwidth(), root2.winfo_reqheight())
# Calendar Buttons
b=ttk.Button(f2, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)
当我按下按钮,它会打开日历窗口,但它是空的。 和控制台给我的错误:
TypeError: __init__() got multiple values for argument 'firstweekday
谢谢
没那么容易。 问题是,你混的两个GUI库。 因此,有必要两个主要事件循环(至少):一个用于Tkinter
代码,一个用于PyQt
代码。
一种方式做你想要的东西-用subprocess
和threading
模块运行calendar.py
在不同的线程。 例:
from tkinter import *
from tkinter import ttk
import subprocess
import threading
master = Tk()
def callback():
subprocess.call('python calendar.py')
b=ttk.Button(master, width=4, text="Cal", command=lambda:threading.Thread(target=callback).start()).grid(column=3,row=1, sticky=W)
mainloop()
另一种方式 - 创建回调函数(肮脏的解决方案)的内部Qt的主事件循环:
from tkinter import *
from tkinter import ttk
from calendar import Calendar
import sys
from PyQt4 import QtGui
master = Tk()
def callback():
app = QtGui.QApplication(sys.argv)
gui = Calendar()
gui.show()
app.exec_()
b=ttk.Button(master, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)
mainloop()
编辑:如何控件调用。 首先,看看这个答案,修改ttkcalendar.py
为kalgasnik建议。 那么试试这个:
from tkinter import *
from tkinter import ttk
from ttkcalendar import Calendar
import calendar
master = Tk()
def callback():
root2=Toplevel(master)
ttkcal = Calendar(root2,firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
root2.update()
root2.minsize(root2.winfo_reqwidth(), root2.winfo_reqheight())
b=ttk.Button(master, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)
mainloop()
编辑2.解决问题
好吧,看来我发现所有的问题。
事实上,导入两次在同一个模块-标准日历模块:
from calendar import Calendar import calendar
但你不导入类Calendar
从ttkcalendar模块(不要忘了所描述的去改变它在这里 )。 因此,进口应该是这样的:
import ttkcalendar
import calendar
创建日历(我改变了代码位为清楚起见):
ttkcal = ttkcalendar.Calendar(root2,firstweekday=calendar.SUNDAY)
在代码中,主窗口被初始化两次:
线15: master = Tk()
线960: root = Tk()
您需要删除第一次初始化。
你混pack()
和grid()
在相同的主窗口。 根据该文件 ,这是一个坏主意:
警告:不要在同主窗口混合电网和包。 Tkinter的会愉快地度过你的一生的其余部分试图通过谈判解决双方的经理很满意。 与其等待,杀应用程序,再看看你的代码。 一个常见的错误是使用了错误的母公司为一些小部件。
所以,相反nb.pack(fill='both', expand='yes')
你必须写这样的事情nb.grid(column=0, row=0, sticky=(W, E))
最后,这里是链接到固定的代码:
ttkcalendar.py
(已修改,准备使用):
https://gist.github.com/anonymous/5e0d973f57e185572df2
您所描述的修改脚本:
https://gist.github.com/anonymous/65cb808dc64e414c0c12