如何解决在 Popup 中的 .kv 中使用 switch_to 使用 factory 打开 .kv 中的另一个选项卡!我无法实现
我的第一个目标是使用 id:delft 来打开标签,方法是使用来自 .kv 文件的工厂函数,然后单击弹出部分的按钮.(button id: buttontx) 当我点击按钮时,我收到这个错误: on_press: Factory.MyLayout().switch_to(MyLayout .ids.delft) NameError: name 'MyLayout' 未定义。
我的第二个目标是从弹出窗口 .kv 创建数据库并在选项卡中显示名称。但是我无法启动它,因为我正在寻找解决我的主要问题的方法。在下面你可能会看到我的 .py 和 .kv 代码。
.PY
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.tabbedpanel import TabbedPanel
import time
import smtplib
import psycopg2
Builder.load_file('tabs.kv')
def sendmail():
username = 'kASASD'
subject = "SAAT 11"
password = 'ddsa'
body = 'DENEME'
msg = "\r\n".join([
"From: " + username,"To: " + username,"Subject: " + subject,"",body
])
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.login(username,password)
print('sending')
server.sendmail(username,username,msg.encode("utf-8",errors="ignore"))
server.quit()
print('sent')
class MyLayout(TabbedPanel):
def updates(self,*args):
# saat,dakika saniye
self.ids.saat.text = time.strftime("%H:%M:%s")
# gün ay yıl gün
self.ids.tarih.text = time.strftime("%d %B %Y %A")
# 23de mail at
if time.strftime("%H:%M:%s") == "23:03:00":
sendmail()
class AwesomeApp(App):
def build(self):
t = MyLayout()
Clock.schedule_interval(t.updates,1)
return t
if __name__ == '__main__':
AwesomeApp().run()
#:import Factory kivy.factory.Factory
<MyPopup@Popup>
# pop up kendine sadece 1 tane widget alır. Birkaç şey koymak istiyorsan. Boxlayout falan yapıp içine
#atman gerekiyor.
# kutu dışına dokununca kaybolsun mu? - hayır
auto_dismiss: False
size_hint: .4,.4
#top .9 = yukarının %90'nında dursun diye. x: saga sola
pos_hint: {"center_x": 0.5,"top": .8}
title: "Herhangi bir veri yok. Veri girin"
BoxLayout:
orientation: "vertical"
size: root.width,root.height
Label:
text: "Herhangi bir veri yok. Veri girin"
text: "Meta girin"
size_hint: 1,.2
TextInput:
id: table_input
text: "Metanız"
size_hint: 1,.2
font_size: 20
BoxLayout:
orientation: "horizontal"
size: root.width,root.height
size_hint: 1,.2
Button:
text: "Oluştur"
font_size: 20
id: create_db
Button:
id: buttontx
text: "Vazgeç"
font_size: 20
on_press: Factory.MyLayout().switch_to(MyLayout.ids.delft)
<MyLayout@TabbedPanel>
do_default_tab: True
default_tab: delft
#orantısal küçültür
size_hint: .99,.99
#ekranın ortasına bütün kareyi koyar
pos_hint: {'center_x': .5,'center_y': .5}
# tabları ortalar - bottom tabları alta atar left_top,left_mid,left_bottom,top_left,top_mid,top_right,#right_top,right_mid,right_bottom,bottom_left,bottom_mid,bottom_right
tab_pos: 'top_mid'
TabbedPanelItem:
id: delft
text: "Anasayfa"
BoxLayout:
Label:
id: saat
text: "Press the Button =>"
Label:
id: tarih
text: "Press the Button =>"
TabbedPanelItem:
text: "Metalar"
on_release:
if inner_Meta.text == "Empty" : Factory.MyPopup().open()
TabbedPanel:
do_default_tab: False
#orantısal küçültür
size_hint: .99,.99
#ekranın ortasına bütün kareyi koyar
pos_hint: {'center_x': .5,'center_y': .5}
# tabları ortalar - bottom tabları alta atar left_top,bottom_right
tab_pos: 'left_mid'
TabbedPanelItem:
id: inner_Meta
text:"Empty"
TabbedPanelItem:
text: "Tab 3"
Image:
source: "/charac.png"
解决方法
我认为没有必要使用 <div class="columns is-centered">
<div class="column is-half">
<button class="button">Center me</button>
</div>
</div>
打开标签页。只需更改:
Factory
到:
on_press: Factory.MyLayout().switch_to(MyLayout.ids.delft)
代码 on_press: app.root.switch_to(app.root.ids.delft)
正在创建 Factory.MyLayout()
的新实例(不是在您的 MyLayout
方法中创建的实例)。而且这个新实例不是您的 GUI 的一部分。代码 build()
会导致错误,因为 kivy 试图将 MyLayout.ids.delft
评估为变量,通常包含对某个小部件实例的引用。即使 kivy 将 MyLayout
识别为一个类,它也不会包含 MyLayout
文件中定义的 ids
,因为它只出现在 kv
的实例中。该修复程序使用 MyLayout
访问 app.root
的实例,它是您的 MyLayout
的根小部件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。