Python 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

感谢

不那么容易。问题是您混合了这两个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()

编辑:如何调用小部件首先,看看这个答案,并按照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。解决问题
好的,好像我发现了所有的问题。

  1. 实际上,您导入两次相同的模块-标准日历模块:

    from calendar import Calendar
    import calendar
    

但是您没有从ttkcalendar模块导入类Calendar(不要忘记按照说明进行更改此处)。所以,导入应该是这样的:

import ttkcalendar
import calendar

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

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

  2. 在同一主窗口中混合使用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

相关内容

  • 没有找到相关文章

最新更新