【问题标题】:Using switch_to within .kv from Popup using factory to open another tab within the .kv! I could not achieve it在 Popup 中使用 switch_to 在 .kv 中使用工厂在 .kv 中打开另一个选项卡!我无法实现
【发布时间】:2021-01-21 22:03:13
【问题描述】:

我的第一个目标是通过使用 .kv 文件中的工厂函数在弹出部分的按钮单击时使用 id:delft 打开选项卡 .(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, left_mid, left_bottom, top_left, top_mid, top_right,
            #right_top, right_mid, right_bottom, bottom_left, bottom_mid, bottom_right
            tab_pos: 'left_mid'

            TabbedPanelItem:
                id: inner_meta
                text:"Empty"



    TabbedPanelItem:
        text: "Tab 3"

        Image:
            source: "/charac.png"

【问题讨论】:

    标签: python tabs kivy factory


    【解决方案1】:

    我认为不需要使用Factory 打开标签。只需更改:

                on_press: Factory.MyLayout().switch_to(MyLayout.ids.delft)
    

    到:

                on_press: app.root.switch_to(app.root.ids.delft)
    

    代码Factory.MyLayout() 正在创建MyLayout 的新实例(不是在您的build() 方法中创建的实例)。而且这个新实例不是您的 GUI 的一部分。代码 MyLayout.ids.delft 会导致错误,因为 kivy 试图将 MyLayout 评估为变量,通常包含对某些小部件实例的引用。即使 kivy 将MyLayout 识别为一个类,它也不会包含在kv 文件中定义的ids,因为它只出现在MyLayout 的实例中。该修复使用app.root 访问MyLayout 的实例,它是App 的根小部件。

    【讨论】:

    • 这是我点击后收到的消息:“感谢反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子得分。”。感谢您的帮助和解释。祝你有美好的一天。
    • 您可以单击复选标记以指示已接受的答案。
    • 感谢您让我知道。我很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多