我把程序弄得短了点,麻烦大家看一下好吗?

软件和网站开发以及相关技术探讨
回复
头像
Hello World!
帖子: 3051
注册时间: 2008-06-23 15:19
系统: ���������
来自: 北欧某国
联系:

我把程序弄得短了点,麻烦大家看一下好吗?

#1

帖子 Hello World! » 2013-02-09 12:50

这是一个文本编辑器。
图片

在 __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]
http://noie.name 网站改版中。
头像
weidongxu
帖子: 13
注册时间: 2013-02-02 10:48

Re: 我把程序弄得短了点,麻烦大家看一下好吗?

#2

帖子 weidongxu » 2013-02-10 15:45

被编辑器背景萌到于是帮忙调试。没怎么玩过gtk,python和qt倒是用过。

既然函数call了也有能work的例子,于是初步怀疑窗口UI没有更新。
遂尝试在 on_new 函数的最后一行加上一句 self.show_all() ,貌似解决问题。

PS: python+gtk看起来倒挺方便么,下次试着拿这组写app玩。
头像
Hello World!
帖子: 3051
注册时间: 2008-06-23 15:19
系统: ���������
来自: 北欧某国
联系:

Re: 我把程序弄得短了点,麻烦大家看一下好吗?

#3

帖子 Hello World! » 2013-02-12 22:39

weidongxu 写了:被编辑器背景萌到于是帮忙调试。没怎么玩过gtk,python和qt倒是用过。

既然函数call了也有能work的例子,于是初步怀疑窗口UI没有更新。
遂尝试在 on_new 函数的最后一行加上一句 self.show_all() ,貌似解决问题。

PS: python+gtk看起来倒挺方便么,下次试着拿这组写app玩。
谢谢您了,我在 on_new 当中加入了一行 “self.show_all()” ,现在问题解决了,程序可以继续往下写了。谢谢您。

现在我又遇到了一点小问题,是一个放着也没什么关系的问题:
[python]#!/usr/bin/python
#coding:utf8

from gi.repository import Gtk, Pango, GtkSource, Gdk, GObject
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()

box.add(Gtk.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")

GObject.signal_new("changed", BEditDocument, GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, ())

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.MenuToolButton.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)

#toolbar = Gtk.Toolbar()
#向标签栏中添加工具栏
#self.notebook.append_page(Gtk.Box(spacing=6), toolbar)
#self.notebook.append_page(Gtk.Box(spacing=6), Gtk.Label('toolbar'))
#toolbar.insert(button[0], 0)
#toolbar.insert(button[1], 1)

def create_notebook(self):
"""建立选项卡"""
self.notebook = Gtk.Notebook()
self.add(self.notebook)

def on_new(self, widget = None):
"""在这里新建一个文档"""
new_textview = BEditDocument()
new_textview.connect("changed", self.on_update_title)
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)
#切换到刚插入的一页
self.show_all()
self.notebook.set_current_page(self.notebook.get_n_pages()-1)

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 on_update_title(self, widget = None):
"""更新标题栏"""
cw = self.notebook.get_nth_page(self.notebook.get_current_page())
cwt = cw.get_child()
print cwt.change_number
if cwt.change_number == 0:
self.set_title(cwt.filename+" ("+cwt.filepath+") - bedit")
new_label = Gtk.Label(cwt.filename)
self.notebook.set_tab_label(cw, new_label.set_name)
else:
self.set_title("*" + cwt.filename+" ("+cwt.filepath+") - bedit")
new_label = Gtk.Label("*" + cwt.filename)
self.notebook.set_tab_label(cw, new_label.set_name)
new_label.set_name("BEditTabLabel")

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.5);
}
* {
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 = ""
self.stext = ""
self.change_number = 0

#修改后的信号
self.get_buffer().connect("changed", self.text_change)


def text_change(self, buffer):
text = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), False)
if self.stext == text:
if self.change_number > 0:
self.change_number = 0
#发出改变标题栏的信号
self.emit('changed')
print 'changed'
#如果被修改了
else:
self.change_number = self.change_number+1
if self.change_number == 1:
self.emit('changed')

if __name__ == "__main__":
win = TextViewWindow()
win.set_name("BEditWindow")
win.connect("delete-event", Gtk.main_quit)
#win.show_all()
Gtk.main()[/python]

我想把按钮添加到工具栏里,然后再将工具栏添加到标签当中,这样可能好看一些。

但是如果把 self.notebook.append_page() 的第二个参数设置为一个工具栏的话,运行时就看不到工具栏了。
20130212223047.jpg
这是现在的显示效果,最后再次感谢您。
http://noie.name 网站改版中。
头像
weidongxu
帖子: 13
注册时间: 2013-02-02 10:48

Re: 我把程序弄得短了点,麻烦大家看一下好吗?

#4

帖子 weidongxu » 2013-02-13 10:56

把 toolbar 放到 notebook 里估计有点问题,个人感觉 notebook 的 tab 相当于按钮,而 toolbar 本身又包含一堆按钮。。。混乱中
回复