单击按钮查看 pdf 后,Tkinter GUI 变得无响应

Tkinter GUI become unresponsive after clicking button to view pdf

Tkinter 问题在我当前的项目中,我正在使用 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()

当我点击这个按钮时,这个 gui 变得没有响应,我不得不从任务管理器中终止这个进程,请帮助我。

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

    window.mainloop()


job_folder()

Tkinter 和 wxPython 不兼容。他们有自己的事件循环,会相互冲突。如果您需要使用 wxPython 的 PDF 查看功能,那么您应该在 wxPython 中编写您的应用程序,而不是在 Tkinter 中。