【问题标题】:Loading database?加载数据库?
【发布时间】:2011-03-21 00:00:39
【问题描述】:

我的问题是,当我连接到 MySQL 数据库时,我该怎么做? 为了更清楚地说明这一点:假设我尝试连接到数据库:

db = MySQLdb.connect(host = "testhost",user ="testuser", passwd ="testpw", db = "testdb")

嗯,一般来说,当主机不是本地主机时,它通常会占用一些加载时间,而当这种情况发生时,应用程序会“冻结”(我使用的是 wxPython)。现在,我想要的是,而不是“冻结”,它会显示代表“加载”的东西,它可以是图像,文本,没关系,而不是冻结。另外,闪屏呢?据我尝试,我所做的只是一些闪屏,这些闪屏在 X 时间后消失,当我点击它时。我真的不知道如何利用它来加载资源,例如 MySQL 数据库。上次我尝试使用启动画面加载 MySQL 数据库时,它实际上是先加载的,然后显示启动画面(哈哈)。 谢谢。

【问题讨论】:

  • 顺便说一句,将数据库设置存储在配置文件而不是程序源代码中。
  • 您可以通过在 MySQL 配置中使用 skip-name-resolve 并通过 IP 地址连接到服务器来摆脱这种延迟。除非尝试解析主机名,否则连接应该几乎是即时的。

标签: python mysql wxpython


【解决方案1】:

感谢您的所有帮助,我得到了一个答案,一个更具体的 wxPython 答案。我按照这个简单的例子让它工作:

import wx
import thread
from time import sleep

class MainFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.label = wx.StaticText(self, label="Ready")
        self.btn = wx.Button(self, label="Start")
        self.gauge = wx.Gauge(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.label, proportion=1, flag=wx.EXPAND)
        sizer.Add(self.btn, proportion=0, flag=wx.EXPAND)
        sizer.Add(self.gauge, proportion=0, flag=wx.EXPAND)

        self.SetSizerAndFit(sizer)

        self.Bind(wx.EVT_BUTTON, self.onButton)

    def onButton(self, evt):
        self.btn.Enable(False)
        self.gauge.SetValue(0)
        self.label.SetLabel("Running")
        thread.start_new_thread(self.longRunning, ())

    def onLongRunDone(self):
        self.gauge.SetValue(100)
        self.label.SetLabel("Done")
        self.btn.Enable(True)

    def longRunning(self):
        """This runs in a different thread.  Sleep is used to simulate a long running task."""
        sleep(3)
        wx.CallAfter(self.gauge.SetValue, 20)
        sleep(5)
        wx.CallAfter(self.gauge.SetValue, 50)
        sleep(1)
        wx.CallAfter(self.gauge.SetValue, 70)
        sleep(10)
        wx.CallAfter(self.onLongRunDone)

if __name__ == "__main__":
    app = wx.PySimpleApp()
    app.TopWindow = MainFrame(None)
    app.TopWindow.Show()
    app.MainLoop()

从这里:http://wiki.wxpython.org/LongRunningTasks,希望这会有所帮助:)。

【讨论】:

    【解决方案2】:

    如果你的程序需要同时做两件事,那么使用多线程是一个很好的方法。在您的情况下,您有一个希望保持响应的 GUI,并且您有一个要连接的数据库。您需要在单独的线程中完成数据库工作,而不是在处理 GUI 事件的线程上;这将在建立连接时保持 GUI 工作。恐怕我不能告诉你如何用 Python 编写多线程代码,但我认为 Google 是你的朋友。

    【讨论】:

    • 是的,我只是想知道如何做这样的事情,所以感谢您的回复!
    【解决方案3】:

    有关如何使用 threading 模块编写多线程 Python 程序的示例,请参阅

    http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/

    以及官方文档:

    http://docs.python.org/library/threading.html

    【讨论】:

      【解决方案4】:

      线程在这种情况下真的很有帮助 看看这个:http://themattreid.com/wordpress/2010/08/30/easy-python-threading-mysql-connections/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 2016-01-14
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多