我正在使用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
谢谢
答案 0 :(得分:1)
不那么容易。问题是你混合了两个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()
编辑:如何调用小部件。
首先,请查看this回答,然后将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.解决问题
好吧,似乎我发现了所有问题。
实际上,您导入两个相同的模块 - 标准calendar模块:
from calendar import Calendar
import calendar
但是你没有从ttkcalendar模块导入类Calendar
(不要忘记按照描述更改它
here)。
因此,导入应如下所示:
import ttkcalendar
import calendar
创建日历(为了清晰起见,我稍微更改了代码):
ttkcal = ttkcalendar.Calendar(root2,firstweekday=calendar.SUNDAY)
在您的代码中,主窗口初始化两次:
第15行:master = Tk()
第960行:root = Tk()
您需要删除第一个初始化。
您在同一主窗口中混合pack()
和grid()
。根据{{3}},这是一个坏主意:
警告:切勿在同一主窗口中混合网格和打包。 Tkinter的 我将很乐意度过余生,努力谈判 两位经理都满意的解决方案。而不是等待,杀死 应用程序,再看看你的代码。一个常见的错误 是为某些小部件使用错误的父级。
所以,相反nb.pack(fill='both', expand='yes')
你必须写这样的东西
nb.grid(column=0, row=0, sticky=(W, E))
最后,这里是固定代码的链接:
ttkcalendar.py
(已修改,可以使用):docs
您描述修改的脚本:
https://gist.github.com/anonymous/5e0d973f57e185572df2