[英]Kivy/Python TextInput Focus
在我的基本除法計算器應用程序中,我有 2 個不同的文本輸入框和一個小屏幕鍵盤。 但是,只要在屏幕鍵盤上的應用程序中按下一個數字,兩個框就會填充完全相同的數字
這是我遇到問題的部分
#creating the button number function
def buttonText(instance): #creating an output to print the button text
if entrnum1.get_focus_previous():
entrnum1.text += instance.text
if entrnum2.get_focus_previous():
entrnum2.text += instance.text
這是完整的代碼:
import kivy #importing kivy and various tools needed
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button
from kivy.graphics import *
from kivy.uix.textinput import TextInput
from kivy.core.window import Window #setting the window size in kivy
from kivy.uix.checkbox import CheckBox
from kivy.uix.dropdown import DropDown
from kivy.config import Config # allows usage of custom made icons
from kivy.uix.behaviors.focus import FocusBehavior
Window.size=(360,600) # setting the window size
class divCalc(RelativeLayout):
layoutHome = RelativeLayout()
def __init__(self,**kwargs):#creating the constructor
super(divCalc, self).__init__(**kwargs)
layoutHome = RelativeLayout()
def div(self):
lblcalc= Label(text="Division Calculator",size_hint=(0.3,0.1), pos_hint={'x':0.12, 'y':0.9},color=(.9,.9,.9,1))
layoutHome.add_widget(lblcalc)
lblnum1 = Label(text="num1 ",size_hint=(0.3,0.1), pos_hint={'x':0.15, 'y':0.8},color=(.9,.9,.9,1))
layoutHome.add_widget(lblnum1)
entrnum1 = TextInput(size_hint=(0.3,0.06), pos_hint={'x':0.48, 'y':0.82}, multiline=False, cursor_color=(0,0,0,1))
layoutHome.add_widget(entrnum1)
lblnum2 = Label(text="num2 ",size_hint=(0.3,0.1), pos_hint={'x':0.15, 'y':0.74},color=(.9,.9,.9,1))
layoutHome.add_widget(lblnum2)
entrnum2 = TextInput(size_hint=(0.3,0.06), pos_hint={'x':0.48, 'y':0.76}, multiline=False, cursor_color=(0,0,0,1))
layoutHome.add_widget(entrnum2)
lblans = Label(text="answer",size_hint=(0.3,0.1), pos_hint={'x':0.15, 'y':0.68},color=(.9,.9,.9,1))
layoutHome.add_widget(lblans)
txtAnswer = TextInput(size_hint=(0.3,0.058), pos_hint={'x':0.48, 'y':0.7}, multiline=False, disabled=True,#disabled sets text input to read only
background_disabled_normal='', background_color=(0.91,0.91,0.031,0.9),disabled_foreground_color=(0,0,0,1),
font_size=20)#setbackground disabled to white first to avoid grey tint
layoutHome.add_widget(txtAnswer)
def supplyCalc(self):
try: #try catch loop for user errors
oneNum = float(entrnum1.text)#Converting TextInput to Float
twoNum = float(entrnum2.text)
answer = round(oneNum/twoNum,5) #rounding the answer to 5 decimal places
txtAnswer.text = str((answer))#converting the answer back to a string and placing into text input box
except:
answer = "ERROR" #if exception is thrown then give error for answer
txtAnswer.text = answer
btnCalculate = Button(text="Calculate",size_hint=(0.3,0.1), pos_hint={'x':0.53, 'y':0.59},color=(.9,.9,.9,1),background_color=(.8,.8,.8,1))
btnCalculate.bind(on_press=supplyCalc)
layoutHome.add_widget(btnCalculate)
#creating the button number function
def buttonText(instance): #creating an output to print the button text
if entrnum1.get_focus_previous(): #partially working, need to figure out how to get focus on textinput
entrnum1.text += instance.text
if entrnum2.get_focus_previous():
entrnum2.text += instance.text
def clearAll(self): #clearing all the text off the screen
entrnum1.text = ''
entrnum2.text = ''
txtAnswer.text = ''
def backSpace(self):
pass
buttonsNums = [7,8,9,4,5,6,1,2,3,0] #creating an empty list for the buttons
y = 0.35 #setting the initial value for y
x = 0.2 # setting the initial value for x
i=1 #creating a counter for i to newline after every 3rd button
#creating a for loop to create the buttons
for num in buttonsNums:
btnCalc = Button(text=str(num),size_hint=(0.2,0.1), pos_hint={'x':x, 'y':y})
btnCalc.bind(on_press=buttonText)#binding the button to then set to its text
layoutHome.add_widget(btnCalc)
x+=0.19
if i%3 == 0:#if 1 divided by 3 has 0 remainder new row
y-=0.10
x=0.2
i+=1
btnDecimal = Button(text=".",size_hint=(0.39,0.1), pos_hint={'x':0.39, 'y':0.05})
btnDecimal.bind(on_release=buttonText)
layoutHome.add_widget(btnDecimal)
btnBackspace = Button(text="<--",size_hint=(0.2,0.1), pos_hint={'x':0.2, 'y':0.45})
btnBackspace.bind(on_release=backSpace)
layoutHome.add_widget(btnBackspace) #THIS BUTTON CURRENT STILL NEEDS WORK
btnClearAll = Button(text="Clear All",size_hint=(0.39,0.1), pos_hint={'x':0.39, 'y':0.45})
btnClearAll.bind(on_release=clearAll)
layoutHome.add_widget(btnClearAll)
div(self)
self.add_widget(layoutHome)
class miniCalc(App): #building the application (night mode, default)
def build(self):
return divCalc()
if __name__ == "__main__": #running the application
miniCalc().run()
非常感謝您的幫助
找到了解決辦法,
因此 textInput 小部件在您觸摸小部件時會自動放下焦點,這意味着在給定某些參數的情況下, unfocus_on_touch 默認設置為 true,因此需要像這樣將其更改為 false
entrnum1 = TextInput(size_hint=(0.3,0.06), unfocus_on_touch=False, pos_hint={'x':0.48,'y':0.82}, multiline=False, cursor_color=(0,0,0,1))
layoutHome.add_widget(entrnum1)
還需要更改 buttonText 函數上的 if 語句:
#creating the button number function
def buttonText(instance): #creating an output to print the button text
if entrnum1.focus == True: #partially working, need to figure out how to get focus on textinput
entrnum1.text += instance.text
if entrnum2.focus == True:
entrnum2.text += instance.text
我找到了一個很好的 kivy 參考
https://buildmedia.readthedocs.org/media/pdf/kivy/master/kivy.pdf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.