我正在使用Python的日历小部件。我需要在点击按钮时调用小部件。这种情况是,我在显示小部件本身的日历类中找不到什么方法。日历类取自此处: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()
编辑:如何调用小部件首先,看看这个答案,并按照kalgasnik的建议修改您的ttkcalendar.py
。然后试试这个:
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
但是您没有从ttkcalendar模块导入类Calendar
(不要忘记按照说明进行更改此处)。所以,导入应该是这样的:
import ttkcalendar
import calendar
创建日历(为了清晰起见,我更改了代码):
ttkcal = ttkcalendar.Calendar(root2,firstweekday=calendar.SUNDAY)
在您的代码中,主窗口被初始化两次:
第15行:master = Tk()
第960行:root = Tk()
您需要删除第一个初始化。在同一主窗口中混合使用
pack()
和grid()
。根据文件,这是一个坏主意:
警告:切勿在同一主窗口中混合网格和包装。编程将愉快地度过余生,尝试谈判两位经理都满意的解决方案。与其等待,不如杀死应用程序,然后重新查看您的代码。常见错误就是对某些小部件使用错误的父级。
所以,你必须写这样的东西来代替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