Python Gtk - set_visible 有气质

Python Gtk - set_visible works temperamentally

我有一个 window,它有两个下拉列表(国家和俱乐部),它们永远不会同时显示。

当应用加载时,两者都不应该可见。第三个下拉列表(锦标赛类型),默认情况下未选择任何内容,决定应显示哪个俱乐部或国家/地区列表。单击屏幕顶部的按钮会填充下拉列表,选择适当的锦标赛类型和相关的 club/or 国家/地区。

实际情况:加载时,两个下拉列表都可见。选择比赛类型后,两个列表都可见。当我单击顶部的按钮时,俱乐部列表可用,而国家/地区列表不可用。后者恰如其分。

我在每种情况下都使用相同的函数 (set_visible()) 来显示或隐藏列表,所以我不知道为什么它在一种情况下有效而在另一种情况下无效二.

下面的代码应该运行。 #Add Tournaments Tab 之后的位创建了小部件,但未成功尝试隐藏组合框。函数 on_type_combo 已更改但未成功尝试隐藏其中一个组合框。函数 on_tournament_details 成功隐藏了相应的框。

#!/usr/bin/python
# coding=utf-8
from gi.repository import Gtk
import wikipedia


class NotebookWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Rugby Database")

        #Initialise data
        self.country_store = Gtk.ListStore(int, str, str)
        self.club_store = Gtk.ListStore(int, str, str, int, int)
        self.tournament_store = Gtk.ListStore(int, str, int, str, int)
        self.cur_id = 0

        self.cur_club = ''
        self.cur_club_id = 0

        self.update_club_id = 0
        self.update_tournament_id = 0

        self.initialise_lists()

        #Create Application Window
        self.set_border_width(10)
        self.set_default_size(800, 600)
        self.set_position(Gtk.WindowPosition.CENTER)

        #Add external container (box)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        #Add tabbed window
        self.nbook = Gtk.Notebook()
        vbox.pack_start(self.nbook, True, True, 0)
        self.nbook.show()


        #Add Tournaments tab
        frame = Gtk.Frame()
        frame.show()

        self.t_type_id = -1

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        self.tournament_box = Gtk.FlowBox()
        self.tournament_box.set_valign(Gtk.Align.START)
        self.tournament_box.set_max_children_per_line(4)
        self.tournament_box.set_selection_mode(Gtk.SelectionMode.SINGLE)
        self.tournament_box.set_activate_on_single_click(True)

        vbox.pack_start(self.tournament_box, True, True, 0)
        self.wiki_label = Gtk.Label()
        self.wiki_label.set_line_wrap(True)
        vbox.add(self.wiki_label)
        tournament_grid = Gtk.Grid()
        tournament_grid.set_column_spacing(5)
        tournament_label = Gtk.Label("  Tournament Name:  ")
        tournament_logo_label = Gtk.Label("Logo:")
        self.tournament_logo_entry = Gtk.Entry()
        self.tournament_entry = Gtk.Entry()
        self.t_type_combo = Gtk.ComboBoxText()
        self.t_holder_combo_country = Gtk.ComboBoxText()
        self.t_holder_combo_club = Gtk.ComboBoxText()

        self.t_holder_combo_country = Gtk.ComboBox.new_with_model(self.country_store)
        renderer_text = Gtk.CellRendererText()
        self.t_holder_combo_country.pack_start(renderer_text, True)
        self.t_holder_combo_country.add_attribute(renderer_text, "text", 1)

        self.t_holder_combo_club = Gtk.ComboBox.new_with_model(self.club_store)
        renderer_text = Gtk.CellRendererText()
        self.t_holder_combo_club.pack_start(renderer_text, True)
        self.t_holder_combo_club.add_attribute(renderer_text, "text", 1)
        self.t_type_combo.append_text("Club")
        self.t_type_combo.append_text("International")
        self.t_type_combo.connect("changed", self.on_type_combo_changed)
        renderer_text = Gtk.CellRendererText()
        self.t_type_combo.pack_start(renderer_text, True)
        self.t_type_combo.add_attribute(renderer_text, "text", 1)
        type_label = Gtk.Label("  Type:  ")
        holder_label = Gtk.Label("  Holder:  ")
        tournament_add = Gtk.Button("  Save  ")
        tournament_grid.add(tournament_label)
        tournament_grid.add(self.tournament_entry)
        tournament_grid.add(type_label)
        tournament_grid.add(self.t_type_combo)
        tournament_grid.add(tournament_logo_label)
        tournament_grid.add(self.tournament_logo_entry)
        tournament_grid.add(holder_label)
        tournament_grid.add(self.t_holder_combo_club)
        tournament_grid.add(self.t_holder_combo_country)
        tournament_grid.add(tournament_add)
        vbox.add(tournament_grid)
        self.t_holder_combo_club.set_visible(False)
        self.t_holder_combo_country.set_visible(False)
        self.tournament_message = Gtk.Label("\n")
        vbox.add(self.tournament_message)
        label = Gtk.Label()
        label.set_markup("<b><big>Tournaments</big></b>")

        frame.add(vbox)

        self.nbook.append_page(frame, label)

        self.load_boxes()



##### Function definitions #####

    def initialise_lists(self):
        self.country_store.clear()
        self.country_store.append([1, 'Ireland', ''])


        self.club_store.clear()
        self.club_store.append([1, 'Leinster', '',1,1])

        self.tournament_store.clear()
        self.tournament_store.append([1, 'Pro 12', 1,'',1])


    def reset_forms(self):
        self.tournament_entry.set_text('')
        self.update_club_id = 0
        self.update_tournament_id = 0
        self.tournament_entry.set_text('')
        self.tournament_logo_entry.set_text('')
        self.wiki_label.set_text('\n')

    def load_boxes(self):
        self.tournament_box.foreach(lambda widget: self.tournament_box.remove(widget))
        for tournament in range(0, len(self.tournament_store)):
            button = Gtk.Button(self.tournament_store[tournament][1])
            self.tournament_box.add(button)
            button.connect('clicked', self.on_tournament_details, tournament)
        self.tournament_box.show_all()


    def on_club_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter is not None:
            model = combo.get_model()
            self.cur_club_id = model[tree_iter][0]


    def on_type_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter is not None:
            model = combo.get_model()
            self.t_type_id = model[tree_iter][0]
        if self.t_type_id is "Club":
            self.t_holder_combo_country.set_visible(False)
            self.t_holder_combo_club.set_visible(True)
        elif self.t_type_id is "International":
            self.t_holder_combo_club.set_visible(False)
            self.t_holder_combo_country.set_visible(True)


    def on_tournament_details(self, button, tournament):
        self.tournament_entry.set_text(self.tournament_store[tournament][1])
        self.t_type_combo.set_active(self.tournament_store[tournament][2]-1)
        self.tournament_logo_entry.set_text(self.tournament_store[tournament][3])
        self.update_tournament_id = self.tournament_store[tournament][0]
        self.tournament_message.set_text('\n')
        self.wiki_label.set_text(wikipedia.summary(self.tournament_store[tournament][1], sentences=2))
        if self.t_type_id == "Club":
            self.t_holder_combo_country.set_visible(False)
            self.t_holder_combo_club.set_visible(True)
            self.t_holder_combo_club.set_active(self.tournament_store[tournament][4]-1)
        elif self.t_type_id == "International":
            self.t_holder_combo_club.set_visible(False)
            self.t_holder_combo_country.set_visible(True)
            self.t_holder_combo_country.set_active(self.tournament_store[tournament][4]-1)



win = NotebookWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()

Gtk.main()

当您调用 win.show_all() 时,告诉下拉列表不显示。这可以通过在不应显示的小部件上调用 set_no_show_all 来完成。