
在 __init__() 中执行 on_new() 后会多出一个标签,执行两次就多出两个标签,标签是使用 notebook.append_page 添加的,这个没有问题。但是我点击“新建”按钮后却没有反应。
根据 print 的反馈,点击“新建”按钮后,on_new() 的确执行了,但是我却看不到新建的标签,这是为什么?明明同样使用了 notebook.append_page。
[python]#!/usr/bin/python
#coding:utf8
from gi.repository import Gtk, Pango, GtkSource, Gdk
import os
class SearchDialog(Gtk.Dialog):
"""这里是一个在文本中搜索字符串的对话框。"""
def __init__(self, parent):
Gtk.Dialog.__init__(self, "Search", parent,
Gtk.DialogFlags.MODAL, buttons=(
Gtk.STOCK_FIND, Gtk.ResponseType.OK,
Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL
)
)
box = self.get_content_area()
label = Gtk.Label("查找:")
box.add(label)
self.entry = Gtk.Entry()
box.add(self.entry)
self.show_all()
class TextViewWindow(Gtk.Window):
"""程序的主要部分"""
def __init__(self):
Gtk.Window.__init__(self, title="TextView Examle")
self.set_default_size(560, 350)
self.create_notebook()
self.create_toolbar()
self.on_new()
self.set_style()
def create_toolbar(self):
"""建立工具栏,这里的工具栏,实际上是选项卡上的一些标签页。"""
button = [Gtk.ToolButton.new_from_stock(Gtk.STOCK_NEW),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_OPEN),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_SAVE),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_PRINT),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_UNDO),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_REDO),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_CUT),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_COPY),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_PASTE),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_FIND),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_FIND_AND_REPLACE)]
for i in button:
self.notebook.append_page(Gtk.Box(spacing=6), i)
button[0].connect("clicked", self.on_new)
button[1].connect("clicked", self.on_open_file)
button[9].connect("clicked", self.on_find)
def create_notebook(self):
"""建立选项卡"""
self.notebook = Gtk.Notebook()
self.add(self.notebook)
def create_textview(self, notebook = None):
scrolledwindow = Gtk.ScrolledWindow()
scrolledwindow.set_hexpand(True)
scrolledwindow.set_vexpand(True)
tabLabel = Gtk.Label("无标题文档")
tabLabel.set_name("BEditTabLabel")
self.notebook.append_page(scrolledwindow, tabLabel)
# 这里是用的是 GtkSource,可以实现语法加亮的。
self.textview = BEditDocument()
self.textbuffer = self.textview.get_buffer()
self.textbuffer.set_text("This is some text inside of a Gtk.TextView. "
+ "Select text and click one of the buttons 'bold', 'italic', "
+ "or 'underline' to modify the text accordingly.")
scrolledwindow.add(self.textview)
self.tag_bold = self.textbuffer.create_tag("bold",
weight=Pango.Weight.BOLD)
self.tag_italic = self.textbuffer.create_tag("italic",
style=Pango.Style.ITALIC)
self.tag_underline = self.textbuffer.create_tag("underline",
underline=Pango.Underline.SINGLE)
self.tag_found = self.textbuffer.create_tag("found",
background="yellow")
self.textview.set_name("BEditView")
css = """
#BEditWindow {
background-image: url('/home/liu/.local/share/gedit/plugins/wallpaper_74694_1024.jpg');
}
#BEditView, #BEditTabLabel{
background-color: RGBA(255,255,255,0.4);
}
* {
background-color: RGBA(255,255,255,0);
}
"""
style_provider = Gtk.CssProvider()
style_provider.load_from_data(css)
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
def on_new(self, widget = None):
"""在这里新建一个文档"""
new_textview = BEditDocument()
new_scrolledwindow = Gtk.ScrolledWindow()
new_scrolledwindow.set_name("BEditView")
new_scrolledwindow.set_hexpand(True)
new_scrolledwindow.set_vexpand(True)
new_scrolledwindow.add(new_textview)
new_label = Gtk.Label("无标题文档")
new_label.set_name("BEditTabLabel")
self.notebook.append_page(new_scrolledwindow, new_label)
print new_scrolledwindow
def on_open_file(self, widget):
cur_wid = self.notebook.get_nth_page(self.notebook.get_current_page())
dialog = Gtk.FileChooserDialog("打开文件", self,
Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
self.add_filters(dialog)
response = dialog.run()
if response == Gtk.ResponseType.OK:
# 在这里读取文件
file_object = open(dialog.get_filename())
try:
all_the_text = file_object.read()
cur_wid_tex = cur_wid.get_child()
cur_wid_tex.get_buffer().set_text(all_the_text)
# 将绝对路径分解成路径和文件名
cur_wid_tex.pathname , cur_wid_tex.filename = os.path.split(dialog.get_filename())
self.set_title(cur_wid_tex.filename+" ("+cur_wid_tex.pathname+") - bedit")
# 设置标签文本
tabLabel = Gtk.Label(cur_wid.get_child().filename)
tabLabel.set_name("BEditTabLabel")
self.notebook.set_tab_label(cur_wid, tabLabel)
finally:
file_object.close()
elif response == Gtk.ResponseType.CANCEL:
print "Cancel clicked"
dialog.destroy()
def on_find(self, widget = None):
dialog = SearchDialog(self)
response = dialog.run()
if response == Gtk.ResponseType.OK:
cursor_textbuffer = self.notebook.get_nth_page(self.notebook.get_current_page()).get_child().get_buffer()
cursor_mark = cursor_textbuffer.get_insert()
start = cursor_textbuffer.get_iter_at_mark(cursor_mark)
if start.get_offset() == self.textbuffer.get_char_count():
start = self.textbuffer.get_start_iter()
self.search_and_mark(dialog.entry.get_text(), start)
dialog.destroy()
def add_filters(self, dialog):
filter_text = Gtk.FileFilter()
filter_text.set_name("文本文件")
filter_text.add_mime_type("text/plain")
dialog.add_filter(filter_text)
filter_py = Gtk.FileFilter()
filter_py.set_name("Python 文件")
filter_py.add_mime_type("text/x-python")
dialog.add_filter(filter_py)
filter_any = Gtk.FileFilter()
filter_any.set_name("所有文件")
filter_any.add_mime_type("*")
dialog.add_filter(filter_any)
def set_style(self):
"""用来设置外观"""
css = """
#BEditWindow {
background-image: url('/home/liu/.local/share/gedit/plugins/wallpaper_74694_1024.jpg');
}
#BEditView, #BEditTabLabel{
background-color: RGBA(255,255,255,0.4);
}
* {
background-color: RGBA(255,255,255,0);
}
"""
style_provider = Gtk.CssProvider()
style_provider.load_from_data(css)
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
class BEditDocument(GtkSource.View):
"""为 GtkSource.View 添加一些原来没有的东西。"""
def __init__(self):
GtkSource.View.__init__(self)
self.filename = ""
self.filepath = ""
if __name__ == "__main__":
win = TextViewWindow()
win.set_name("BEditWindow")
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()[/python]