- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天是个好日子。我目前正在尝试实现一个带有输入框的弹出式数字键盘,以便在 pi 4 触摸屏上使用。找了一会发现this 提供的有效解决方案的论坛斯科特101 .不幸的是,该代码仅对单个条目小部件有效。在用我糟糕的面向对象知识折腾了一段时间之后,我似乎无法找到一种方法来实现此代码以使用多个条目小部件。
我的代码的简化工作版本:
import tkinter as tk
from tkinter import simpledialog
from time import strftime
class Page(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
def show(self):
self.lift()
class Page1(Page):
def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
self.Create_Page1_Widgets()
def Create_Page1_Widgets(self):
self.BackCan=tk.Canvas(self,width=800,height=440,borderwidth=0,bg="white")
self.BackCan.place(x=0,y=0)
#Entry Boxes#
self.Page1Var1 = tk.StringVar()
self.Page1Var2 = tk.StringVar()
self.Page1e1=tk.Entry(self,width=12,justify="center",textvariable=self.Page1Var1)
self.Page1e1.bind('<FocusIn>',self.numpadEntry); self.edited = False
self.Page1e1.place(x=10,y=163,width=102,height=26)
self.Page1e2=tk.Entry(self,width=12,justify="center",textvariable=self.Page1Var2)
self.Page1e2.bind('<FocusIn>',self.numpadEntry);
self.Page1e2.place(x=129,y=163,width=102,height=26)
def numpadEntry(self, event):
if self.edited == False:
self.edited = True
new = numPad(self,self)
else:
self.edited = False
class Page2(Page):
def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
self.Create_Page2_Widgets()
def Create_Page2_Widgets(self):
#Validation#
#Page Backround#
self.BackCan=tk.Canvas(self,width=800,height=440,borderwidth=0,bg="white")
self.BackCan.place(x=0,y=0)
##Entry Boxes##
self.Page2Var1 = tk.StringVar()
self.Page2Var2 = tk.StringVar()
self.PrefertHRe=tk.Entry(self,width=12,justify="center",textvariable=self.Page2Var1)
self.PrefertHRe.bind('<FocusIn>',self.numpadEntry); self.edited = False #<-calls numpad
self.PrefertHRe.place(x=10,y=200,width=102,height=26)
self.PrefertMINe=tk.Entry(self,width=12,justify="center",textvariable=self.Page2Var2)
self.PrefertMINe.place(x=129,y=200,width=102,height=26)
def numpadEntry(self, event):
if self.edited == False:
self.edited = True
new = numPad(self,self)
else:
self.edited = False
class numPad(simpledialog.Dialog):
def __init__(self,master=None,parent=None):
self.parent = parent
self.top = tk.Toplevel(master=master)
self.top.protocol("WM_DELETE_WINDOW",self.ok)
self.createWidgets()
def createWidgets(self):
btn_list = ['7', '8', '9', '4', '5', '6', '1', '2', '3', '0', 'Close', 'Del']
r = 1
c = 0
n = 0
btn = []
for label in btn_list:
cmd = lambda x = label: self.click(x)
cur = tk.Button(self.top, text=label, width=6, height=3, command=cmd)
btn.append(cur)
btn[-1].grid(row=r, column=c)
n += 1
c += 1
if c == 3:
c = 0
r += 1
def click(self,label):
print(label)
if label == 'Del':
currentText = self.parent.Page1Var1.get() #<--Page1Var1 need to be dynamic?
self.parent.Page1Var1.set(currentText[:-1])
elif label == 'Close':
self.ok()
else:
currentText = self.parent.Page1Var1.get()
self.parent.Page1Var1.set(currentText+label)
def ok(self):
self.top.destroy()
self.top.master.focus()
class MainView(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
super().__init__()
#Navigation Frame#
p2 = Page2(self);p1 = Page1(self)
Navigation_frame = tk.Frame(self, width=800, height=55, background="bisque")
container = tk.Frame(self)
Navigation_frame.pack(side="bottom");Navigation_frame.pack_propagate(0)
container.pack(side="top", fill="both", expand=True)
NavCan=tk.Canvas(Navigation_frame,width=800,height=55,borderwidth=0,bg="white")
NavCan.place(x=0,y=0)
p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
b1 = tk.Button(Navigation_frame, height=2, width=10, text="1", command=p1.lift)
b2 = tk.Button(Navigation_frame, height=2, width=10, text="2", command=p2.lift)
b1.place(x=144, y=6);b2.place(x=253, y=6)
#Clock#
def clock():
string = strftime('%H:%M:%S')
lbl.config(text = string); lbl.after(1000, clock)
#Clock Label#
lbl = tk.Label(Navigation_frame,font=("Arial",20,'bold'),background= 'grey',foreground
= 'black'); lbl.place(x=20, y=12)
p1.show()
clock()
if __name__ == "__main__":
root = tk.Tk()
main = MainView(root)
main.pack(side="top", fill="both", expand=True)
root.wm_geometry("800x440")
root.attributes('-fullscreen', False)
root.mainloop()
所以问题是,有没有办法将小键盘焦点更改为另一个条目小部件的焦点?
最佳答案
这个想法是有一个 current_entry
MainView
中的属性包含当前选定的条目。然后定义 numpadEntry()
用作MainView
的方法更新 current_entry
的值:
def numpadEntry(self, event):
# change current entry
self.current_entry = event.widget
if self.numpad is None: # numpad does not exists
self.numpad = NumPad(self)
else:
self.numpad.lift() # make numpad visible
在这个函数中,我还假设
MainView
有一个
numpad
属性,它是 NumPad 窗口。
<FocusIn>
在您对
numpadEntry
的所有条目上编辑当前的。然后在小键盘中,不用修改一个StringVar,直接用
entry.delete(-1)
修改入口内容和
entry.insert('end', <char>)
.
import tkinter as tk
class Page(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
self.create_widgets()
def create_widgets(self):
pass
def show(self):
self.lift()
class Page1(Page):
def create_widgets(self):
self.BackCan = tk.Canvas(self, width=800, height=440, borderwidth=0, bg="white")
self.BackCan.place(x=0, y=0)
#Entry Boxes#
self.Page1e1 = tk.Entry(self, width=12, justify="center")
self.Page1e1.bind('<FocusIn>', self.master.numpadEntry)
self.edited = False
self.Page1e1.place(x=10, y=163, width=102, height=26)
self.Page1e2 = tk.Entry(self, width=12, justify="center")
self.Page1e2.bind('<FocusIn>', self.master.numpadEntry)
self.Page1e2.place(x=129, y=163, width=102, height=26)
class Page2(Page):
def create_widgets(self):
#Validation#
#Page Backround#
self.BackCan = tk.Canvas(self, width=800, height=440, borderwidth=0, bg="white")
self.BackCan.place(x=0, y=0)
##Entry Boxes##
self.PrefertHRe = tk.Entry(self, width=12, justify="center")
self.PrefertHRe.bind('<FocusIn>', self.master.numpadEntry)
self.edited = False #<-calls numpad
self.PrefertHRe.place(x=10, y=200, width=102, height=26)
self.PrefertMINe = tk.Entry(self, width=12, justify="center")
self.PrefertMINe.place(x=129, y=200, width=102, height=26)
self.PrefertMINe.bind('<FocusIn>', self.master.numpadEntry)
class NumPad(tk.Toplevel):
def __init__(self, master=None):
tk.Toplevel.__init__(self, master)
self.protocol("WM_DELETE_WINDOW", self.ok)
self.createWidgets()
def createWidgets(self):
btn_list = ['7', '8', '9', '4', '5', '6', '1', '2', '3', '0', 'Close', 'Del']
r = 1
c = 0
n = 0
for label in btn_list:
cur = tk.Button(self, text=label, width=6, height=3,
command=lambda x=label: self.click(x))
cur.grid(row=r, column=c)
n += 1
c += 1
if c == 3:
c = 0
r += 1
def click(self, label):
if label == 'Del':
self.master.current_entry.delete(-1)
elif label == 'Close':
self.ok()
else:
self.master.current_entry.insert('end', label)
def ok(self):
self.destroy()
self.master.focus()
self.master.numpad = None
class MainView(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
self.numpad = None # NumPad
self.current_entry = None # currently selected entry
p2 = Page2(self)
p1 = Page1(self)
Navigation_frame = tk.Frame(self, width=800, height=55, background="bisque")
container = tk.Frame(self)
Navigation_frame.pack(side="bottom")
Navigation_frame.pack_propagate(0)
container.pack(side="top", fill="both", expand=True)
NavCan = tk.Canvas(Navigation_frame, width=800, height=55, borderwidth=0, bg="white")
NavCan.place(x=0, y=0)
p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
b1 = tk.Button(Navigation_frame, height=2, width=10, text="1", command=p1.show)
b2 = tk.Button(Navigation_frame, height=2, width=10, text="2", command=p2.show)
b1.place(x=144, y=6)
b2.place(x=253, y=6)
p1.show()
def numpadEntry(self, event):
# change current entry
self.current_entry = event.widget
# create numpad if does not exist yet
if self.numpad is None:
self.numpad = NumPad(self)
else:
self.numpad.lift()
if __name__ == "__main__":
root = tk.Tk()
main = MainView(root)
main.pack(side="top", fill="both", expand=True)
root.wm_geometry("800x440")
root.attributes('-fullscreen', False)
root.mainloop()
关于python - 用于多个输入框的弹出小键盘(数字小键盘),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63245400/
我试图在我的窗口中放置一个小的输入框,该窗口目前是一个黑色的窗口。 我的代码在下面,谁能告诉我如何将输入框输入到窗口中,谢谢 "#include /* Declare Windows proce
我发现这段代码可以为 powershell 创建简单的输入框: [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBa
我有以下 Excel 文件的输入框。我不想显示输入字符而需要显示输入框字符 * ,该怎么做? Private Sub Workbook_Open() Dim UserName As String Us
我有一个名字输入框。我想在用户键入时自动将名称的第一个字母大写,但允许用户覆盖名称的更改,例如“de Salis”。 我看到 here 这对于 CSS 是不可能的,因为 text-transform:
嘿,伙计们,我需要帮助,我有这个样式表,里面是管理 div...它目前的宽度为 20px,高度为 50px,当鼠标指针悬停时它会变大..我希望发生的是当我将鼠标指针悬停在那里时,它会展开文本和输入框,
我正在为我的 ASP.NET 应用程序开发 UI,我有一个登录表单,其中有一个框,框内有这样的字段。 (xxxx为输入框) Name: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
为了给图标腾出空间,我将占位符文本 35px 移到了我的 input 的右侧;但是,当我开始在 input 字段中键入时,文本从图标后面开始。 我尝试了一些谷歌搜索,但我还没有找到答案。我看到的搜索结
美好的一天。我正在尝试创建自己的输入框以用于我的项目。基本上我想做的是运行我的主窗体,它将调用第二个窗体。用户将在第二个上提供一些数据,当在第二个上按下确定/关闭按钮时,数据将传回第一个。功能类似于输
我需要一个快速文本输入对话框(其中包含一个文本框的 MessageBox)。是否有可用的控件或我应该使用表单? 我只想让用户输入一些 ID。在其他情况下,我需要 2 个文本框作为用户名和密码。 最佳答
禁用 HTML 的 INPUT 文本框的代码是什么? 谢谢 最佳答案 参见 W3C HTML Specification on the input tag获取更多信息。 关于HTML 输入框 - 禁
嘿,我正在努力寻找“最佳位置”,以便它能够按照我的需要工作。 下面是我当前正在使用的 JS 代码。 和框代码: $("#ANDbtn").click(function() { if (numOR
我正在提出一个问题,人们必须输入其中包含普通文本和上标的答案。我认为最好的方法是制作一个按钮,使用户能够将文本放入上标,然后转义上标,但我不知道如何解决这个问题并使文本显示为上标。 这是我到目前为止所
我需要一个输入文本框,它只能接受 0 和 1 的字符串,例如 00101110101。 限制输入任何字母,但是,我们可以输入 1,2,3,4 等等。我需要将输入字符串限制为仅包含 0 和 1。 有什么
我有一个按钮,可以在前一个输入框的正下方添加一个输入框。我想添加一个动画,试图让它更流畅,而不是仅仅在那里弹出。到目前为止,我已经尝试过了,但是没有用。一个 fiddle 的例子会很棒。 var co
我正在尝试使用 jquery 创建一个计算 GPA 的 webview 应用程序,我创建了两个按钮,其中一个用于添加新元素,另一个用于删除元素,我正在尝试添加多个元素同时,例如模块名称、学分输入和选项
我有一个简单的输入框 具有以下样式: input { border-radius: 5px; width: 564px; opacity: 0.14; } 我的问题是因为我改
我有一个小页面,可让我通过单击“添加股票”按钮将股票添加到我的投资组合中,查看下图以供引用。 单击“添加股票”按钮会弹出一个模式框,其中列出了我可以添加到我的投资组合中的股票。 我可以通过单击“分配”
我想使用这个 css 设置:border-color: red; 对于 input 元素。 但是当我这样做时,它们的指标与默认的 chrome 边框不同。 请看这个jsfiddle: http://j
我正在尝试制作一个输入框,当它被聚焦时获取键盘输入,并且只在框的中间显示那个键名,没有闪烁的条,也不允许编辑。并且还将变量更改为键。 所以如果 [ ] 是一个输入框。我输入 F7 然后框应该显示 [
我想要一个用于输入日期的输入框,以便用户只能以一种方式输入。 键入前的输入框如下所示(没有下划线)__/__/____,以及 / 不会在用户键入日期时被删除。 谢谢 最佳答案 感谢@Bryan Oak
我是一名优秀的程序员,十分优秀!