【发布时间】:2019-01-01 08:06:23
【问题描述】:
我是一名人文学科教师,正在尝试改编一个简单的应用程序来帮助教师管理课堂互动 - 它需要出勤率,然后允许随机召集学生上课,或将他们分组,或记录因故缺席,以及很快。长期以来,我一直在笔记本电脑上本地运行 PHP / MySQL 的工作版本,但我想让它成为一个可移植的 python / sqlite 应用程序,着眼于发布到野外供其他教师使用和改进。
但我对 wxPython 完全陌生,一般来说,我对面向对象的编程并不是很擅长。我花了几个小时阅读(或浏览)相当多的教程和介绍以及 StackOverflow 问题,我也玩过 wxFormBuilder,但我觉得我没有取得进展——我仍然对面板和大小和布局,以及哪些位应该属于哪些父项。
我认为,如果我可以让这个最小版本正常工作,那对我真正的应用程序会有很大帮助。顶部的类似工具栏的按钮似乎工作正常,但我希望下方有一个“显示”区域,垂直尺寸最小(但可扩展),文本区域居中,显示中有一排 2-3 个按钮该文本下方的区域。该显示区域应根据上面按下的按钮进行更改和清除。这是我得到的:
#!/usr/bin/env python3
import wx
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(-1,-1))
# self.panel = wx.Panel(self, size=(-1,300))
# buttons bar
self.top_button_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.btn_left = wx.Button(self, -1, label="left")
self.btn_right = wx.Button(self, -1, label="right")
self.btn_left.Bind(wx.EVT_BUTTON, self.OnLeft)
self.btn_right.Bind(wx.EVT_BUTTON, self.OnRight)
self.top_button_sizer.Add(self.btn_left, 1, wx.EXPAND)
self.top_button_sizer.Add(self.btn_right, 1, wx.EXPAND)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.display_sizer = wx.BoxSizer(wx.VERTICAL)
self.text_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.display_text = wx.StaticText(self, label="Push a button!")
self.display_buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.text_sizer.Add(self.display_text, 0, wx.ALIGN_CENTER, 5)
self.display_sizer.Add(self.text_sizer, 1, wx.ALIGN_CENTER, 5)
self.display_sizer.Add(self.display_buttons_sizer, 0, wx.EXPAND)
self.sizer.Add(self.top_button_sizer, 0, wx.TOP | wx.EXPAND)
# self.sizer.Add(self.panel)
self.sizer.Add(self.display_sizer, 1, wx.EXPAND)
self.SetSizerAndFit(self.sizer)
self.Show()
def OnLeft(self,e):
# for child in self.display_buttons_sizer.GetChildren():
# child.Destroy()
# ^ my attempt to "clear" causes a SegFault
for child in self.display_buttons_sizer.GetChildren():
child.Destroy()
self.display_text.SetLabel("Hey lefty!")
self.btn_hey = wx.Button(self, -1, label="Hey yourself lefty.")
self.btn_whoa = wx.Button(self, -1, label="Whoa there lefty.")
self.display_buttons_sizer.Add(self.btn_hey, 1, wx.EXPAND)
self.display_buttons_sizer.Add(self.btn_whoa, 1, wx.EXPAND)
self.sizer.Layout()
def OnRight(self,e):
# for child in self.display_buttons_sizer.GetChildren():
# child.Destroy()
# ^ my attempt to "clear" causes a SegFault!
self.display_text.SetLabel("Hey righty!")
self.btn_hey = wx.Button(self, -1, label="Hey yourself righty.")
self.btn_whoa = wx.Button(self, -1, label="Whoa there righty.")
self.display_buttons_sizer.Add(self.btn_hey, 1, wx.EXPAND)
self.display_buttons_sizer.Add(self.btn_whoa, 1, wx.EXPAND)
self.sizer.Layout()
app = wx.App(False)
frame = MainWindow(None, "MWE")
app.MainLoop()
(我确信这在很多方面都是可恶的代码。)我应该在某个地方放置一个面板吗?在哪里,如何?学习“笔记本”而不是使用我的顶部按钮会更容易吗?如何正确清除下方“显示”区域中的内容以便下次按下按钮?
奖励积分:在我的真实应用中,最复杂的顶部按钮是用于考勤。它将显示多行文本(我从 sqlite 获得的那个班级的学生;我认为我已经完成了那部分),每行旁边带有出席/缺席的单选按钮,然后记录在数据库中。对此的提示也将不胜感激。
提前感谢您的耐心等待。
【问题讨论】: