Python QtGui日历小部件调用按钮

时间:2014-08-26 14:26:16

标签: python calendar widget qwidget qtgui

我正在使用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

谢谢

1 个答案:

答案 0 :(得分:1)

不那么容易。问题是你混合了两个GUI库。因此,必须有两个主要事件循环(至少):一个用于Tkinter代码,一个用于PyQt代码。
一种方法可以执行您想要的操作 - 使用subprocessthreading模块在​​不同的线程中运行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.解决问题
好吧,似乎我发现了所有问题。

  1. 实际上,您导入两个相同的模块 - 标准calendar模块:

    from calendar import Calendar
    import calendar
    
  2. 但是你没有从ttkcalendar模块导入类Calendar(不要忘记按照描述更改它 here)。 因此,导入应如下所示:

    import ttkcalendar
    import calendar
    

    创建日历(为了清晰起见,我稍微更改了代码):

    ttkcal = ttkcalendar.Calendar(root2,firstweekday=calendar.SUNDAY)
    
    1. 在您的代码中,主窗口初始化两次:
      第15行:master = Tk()
      第960行:root = Tk()
      您需要删除第一个初始化。

    2. 您在同一主窗口中混合pack()grid()。根据{{​​3}},这是一个坏主意:

    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