最近我在学习wxpython,就准备了一个类似notepad的实例学习。
然后我做好了一个替换文本的功能,希望使它能够在鼠标选中文本时只替换鼠标选中的文本,
代码逻辑问题应该不大,但是我写好以后发现因为替换文本我是单独写了一个窗口
所以当我在主窗口用鼠标选择好文字以后,再点击替换文本的窗口,主窗口文字的选中状态就消失了。
代码如下:
import wx
import tkinter.filedialog
from os import system
class _Frame(wx.Frame):
def __init__(self): # 初始化
wx.Frame.__init__(self, None)
self.SetSize((960, 660))
self.SetTitle('notepad')
icon = wx.Icon('图标.jpg')
self.SetIcon(icon)
self.saved = False
self._menu()
self._entry()
def _menu(self):
self.menuBar = wx.MenuBar() # 创建菜单栏
self.SetMenuBar(self.menuBar) # 将菜单栏添加进主窗口
self.menu1 = wx.Menu() # 定义菜单
self.menuBar.Append(self.menu1, '选项') # 将菜单1添加进菜单栏
self.bye = wx.MenuItem(None, -1, '退出\tctrl+q') # 定义退出菜单项
self.save = wx.MenuItem(None, -1, '保存\tctrl+s') # 定义保存菜单项
self.new = wx.MenuItem(None, -1, '新建\tctrl+n') # 定义新建窗口菜单项
self.replace = wx.MenuItem(None, -1, '替换\tctrl+r') # 定义替换文本菜单项
self.menu1.Append(self.new) # 将新建窗口菜单项添加进菜单1
self.menu1.Append(self.replace) # 将替换文本菜单项添加进菜单1
self.menu1.Append(self.save) # 将保存菜单项添加进菜单1
self.menu1.Append(self.bye) # 将菜单项添加进菜单1
self.Bind(wx.EVT_MENU, self._exit, self.bye) # 绑定退出按钮
self.Bind(wx.EVT_MENU, self._save, self.save) # 绑定保存文件按钮
self.Bind(wx.EVT_MENU, self._new_window, self.new) # 绑定新建窗口按钮
self.Bind(wx.EVT_MENU, self._replace_window, self.replace) # 绑定文本替换按钮
def _entry(self): # 定义文本输入框
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
def _exit(self, e): # 定义关闭窗口函数
self.Destroy()
def _save(self, e): # 定义保存文件函数
if not self.saved: # 在文件目录尚未选择前弹窗选择
self.path = tkinter.filedialog.asksaveasfilename(filetypes=[('文本文档', '.txt',)])
if '.txt' not in self.path: # 在用户输出的路径中添加后缀名
self.path += '.txt'
self.saved = True
self.SetTitle(self.path.split('/')[-1]) # 将窗口标题设置为文件名称
with open(self.path, 'w') as file:
file.write(self.control.GetValue()) # 保存文件
def _new_window(self, e): # 定义新建窗口函数
_Frame().Show(True)
wx.App().MainLoop()
def _replace_text(self, e): # 定义替换文本函数
self.a_text = self.a.GetValue() # 获取要替换的文本
self.b_text = self.b.GetValue() # 获取要替换为的文本
self.text = self.control.GetValue() # 获取用户输入内容
if self.control.GetStringSelection():
self.text = self.control.GetStringSelection()
self.counter = 1
self.c_text = self.text.replace(self.a_text, self.b_text) # 替换后的文本
self.contrast_text = self.text.replace(self.a_text, self.b_text, 1) # 记录替换次数
if self.contrast_text == self.text:
self.counter = 0
system('msg %username% 替换失败!未能找到要替换的字符')
else:
while not self.c_text == self.contrast_text:
self.contrast_text = self.contrast_text.replace(self.a_text, self.b_text, 1)
self.counter += 1
system('msg %username% \"{}\"'.format('''替换成功!共替换了''' + str(self.counter) + '处字符。'))
self.control.SetValue(self.c_text) # 将输入框中文本替换为替换后的文本
def _replace_window(self, e): # 定义替换文本窗口
self.app = wx.App()
self.frame_r = wx.Frame(self, title='替换', size=(484, 200), name='frame')
self.icon = wx.Icon(r'C:\Users\Administrator\Desktop\狗头.png')
self.frame_r.SetIcon(self.icon)
self.p = wx.Panel(self.frame_r)
self.p.SetOwnBackgroundColour((255, 255, 255, 255))
self.frame_r.Centre()
self.a = wx.TextCtrl(self.p, size=(240, 30), pos=(150, 15), value='', name='text',
style=0)
self.b = wx.TextCtrl(self.p, size=(240, 30), pos=(150, 60), value='', name='text',
style=0)
self.alert_text = wx.StaticText(self.p, size=(100, 30), pos=(40, 16), label='要替换的文本:',
name='staticText', style=2321)
self.b_text = wx.StaticText(self.p, size=(75, 30), pos=(64, 65), label='替换为:',
name='staticText', style=2321)
self.a_button = wx.Button(self.p, label='替换', style=wx.BU_BOTTOM, pos=(200, 115))
self.frame_r.Bind(wx.EVT_BUTTON, self._replace_text, self.a_button)
self.frame_r.Show()
self.app.MainLoop()
if __name__ == '__main__':
app = wx.App()
f = _Frame()
f.Show(True)
app.MainLoop()
我希望效果是在主窗口选择文字之后,点击替换文本窗口,
主窗口文本的选择状态不会消失