Tkinter GUI在单击按钮查看pd后没有响应

2024-04-19 19:49:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在我当前的项目中,我使用reportlab生成pdf文件,并使用使用wxPython包编码的pdf查看器查看它。当我点击按钮查看pdf时,查看器打开并正常工作,但GUI没有响应,按钮冻结。我必须用任务管理器终止这个进程。你知道吗

import tkinter
from tkinter import ttk
import storage
from tkinter import messagebox
from tabulate import tabulate
from tkcalendar import Calendar, DateEntry

import wx
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4, inch
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, 
Paragraph, Image, Spacer
from reportlab.lib.styles import getSampleStyleSheet

import locale
import wx.lib.sized_controls as sc
from wx.lib.pdfviewer import pdfViewer, pdfButtonPanel


def job_folder():
    window = tkinter.Tk()
    window.geometry("1200x550+100+50")
    window.resizable(False, False)
    window.title("Job Folder")

这段代码使用页眉和页脚图像创建pdf文件,并从数据库中获取数据。你知道吗

    app = wx.App()
    frame = wx.Frame(None, title='Simple application')

    doc = SimpleDocTemplate("job_folder1.pdf", pagesize=A4, rightMargin=30, leftMargin=30, topMargin=30,
                            bottomMargin=18)
    doc.pagesize = A4
    elements = []
    logo = "header.jpg"
    im = Image(logo, 7 * inch, 1.1 * inch, hAlign='CENTER')
    elements.append(im)
    elements.append(Spacer(1, 0.25 * inch))
    db = storage.connect()
    cursor = db.cursor()
    cursor.execute(
        "select CONCAT(prefix,job_no ) AS job,date_,account,shipper,
    consignee, maste, house, freight, place_receipt, final_dest, status
    "
    " from sea_exp_tra_job_folder ")
    data = cursor.fetchall()
    db.close()
    dataa = [('Job No', 'Date', 'Account', 'Shipper', 'Consignee', 'Master',
              'House', 'PP/CC', 'Origin', 'Destination', 'Status')]
    dataa.extend(data)
    data = tuple(dataa)
    style = TableStyle([('ALIGN', (1, 1), (-2, -2), 'RIGHT'),
                        ('BACKGROUND', (0, 0), (-1, 0), colors.powderblue),
                        ('TEXTCOLOR', (1, 1), (-2, -2), colors.black),
                        ('VALIGN', (0, 0), (0, -1), 'TOP'),
                        ('TEXTCOLOR', (0, 0), (0, -1), colors.black),
                        ('ALIGN', (0, -1), (-1, -1), 'CENTER'),
                        ('VALIGN', (0, -1), (-1, -1), 'MIDDLE'),
                        ('TEXTCOLOR', (0, -1), (-1, -1), colors.green),
                        ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
                        ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                        ])
    s = getSampleStyleSheet()
    s = s["BodyText"]
    s.wordWrap = 'CJK'
    data2 = [[Paragraph(cell, s) for cell in row] for row in data]
    t = Table(data2)
    t.setStyle(style)
    elements.append(t)
    elements.append(Spacer(1, 0.25 * inch))
    logo1 = "footer.png"
    im1 = Image(logo1, 6 * inch, 0.6 * inch, hAlign='CENTER')
    elements.append(im1)
    doc.build(elements)

编写此代码是为了在wx PDF查看器中查看PDF文件

    def prev123():
        locale.setlocale(locale.LC_ALL, 'C')

        class PDFViewer(sc.SizedFrame):
            def __init__(self, parent, **kwds):
                super(PDFViewer, self).__init__(parent, **kwds)

                paneCont = self.GetContentsPane()
                self.buttonpanel = pdfButtonPanel(paneCont, wx.ID_ANY,
                                                  wx.DefaultPosition,
                                                  wx.DefaultSize, 0)
                self.buttonpanel.SetSizerProps(expand=True)
                self.viewer = pdfViewer(paneCont, wx.ID_ANY, 
                                        wx.DefaultPosition,
                                        wx.DefaultSize,
                                        wx.HSCROLL | wx.VSCROLL |
                                        wx.SUNKEN_BORDER)

                self.viewer.SetSizerProps(expand=True, proportion=1)

                self.buttonpanel.viewer = self.viewer
                self.viewer.buttonpanel = self.buttonpanel

        if __name__ == '__main__':
            import wx.lib.mixins.inspection as WIT
            app = WIT.InspectableApp(redirect=False)
            pdfV = PDFViewer(None, size=(800, 600))
            pdfV.viewer.LoadFile(r'job_folder1.pdf')
            pdfV.Show()
            app.MainLoop()

当我点击这个按钮,然后这个图形用户界面变得没有反应,我必须杀死这个进程从任务管理器请帮助我这个。你知道吗

    B2 = tkinter.Button(window, text="Preview and Print", width=14,
                        command=prev123)
    B2.place(x=570, y=95)

    window.mainloop()


job_folder()

Tags: fromimportselfpdftkinterlibjobelements
1条回答
网友
1楼 · 发布于 2024-04-19 19:49:07

Tkinter和wxPython不兼容。它们有自己的事件循环,这些循环会相互冲突。如果需要使用wxPython的PDF查看功能,那么应该使用wxPython而不是Tkinter编写应用程序。你知道吗

相关问题 更多 >