在GUI中没有块主要文件读取文件

时间:2017-11-08 17:38:12

标签: python python-3.x wxpython threadpool python-multithreading

在我的first attempt中,我尝试过,失败了,学到了,然后又回来了以下尝试。

我有一个文本文件,其名称解析为逗号,如下所示:

Ann Marie,Smith,ams@companyname.com

该列表中可能包含超过100个名称。我遗漏了生成所有其他GUI组件的代码,专注于加载组合框和项目。

我尝试读取文本并将数据加载到组合框中而不会阻塞主线程。我查阅了一本教科书和Pythons文档,这就是我想出来的。

问题:

在我的def read_employees(self,read_file):中,我返回了list我读过的数据。我知道list不是线程安全的,我在这里使用它的方式还可以吗?

def textfilemanage(self):中设置组合框也是如此。我通过执行self.combo = wx.ComboBox(self.panel, choices=data)在该方法中设置组合框。那可以吗?

import wx
import concurrent.futures

class Mywin(wx.Frame):

    def __init__(self, parent, title):
        super(Mywin, self).__init__(parent, title=title, size=(300, 200))

        self.panel = wx.Panel(self)
        box = wx.BoxSizer(wx.VERTICAL)
        self.textfilemanage()
        self.label = wx.StaticText(self.panel, label="Your choice:", style=wx.ALIGN_CENTRE)
        box.Add(self.label, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 20)
        cblbl = wx.StaticText(self.panel, label="Combo box", style=wx.ALIGN_CENTRE)

        box.Add(cblbl, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)

        box.Add(self.combo, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
        chlbl = wx.StaticText(self.panel, label="Choice control", style=wx.ALIGN_CENTRE)
        box.AddStretchSpacer()
        self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo)

        self.panel.SetSizer(box)
        self.Centre()
        self.Show()

    def read_employees(self,read_file):
        emp_list = []
        with open(read_file) as f_obj:
            for line in f_obj:
                emp_list.append(line)
        return emp_list

    def textfilemanage(self):
        filename = 'employees.txt'

        with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
            future_to_read = {executor.submit(self.read_employees, filename)}
            for future in concurrent.futures.as_completed(future_to_read):
                data = future.result()

        self.combo = wx.ComboBox(self.panel, choices=data)

    def OnCombo(self, event):
        self.label.SetLabel("You selected" + self.combo.GetValue() + " from Combobox")


app = wx.App()
Mywin(None, 'ComboBox and Choice demo')
app.MainLoop()

1 个答案:

答案 0 :(得分:0)

for中的textfilemanage() - 循环等待线程完成,因此代码中的不同线程无用。

相反:

__init__中创建空组合框(布局所需)并将其分配给self.combo

textfilemanage()启动线程但不要等待它。

read_employees()中用

替换最终的return语句
wx.CallAfter(self.combo.Append, emp_list)

wx.CallAfter(self.combo.AppendItems, emp_list)

(取决于接受变体的wxPython版本)